// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncountedLocalVarsChecker -verify %s #include "mock-types.h" #include "mock-system-header.h" void someFunction(); namespace local_vars_const_refptr_member { class Foo { public: Foo(); void bar(); RefCountable& ensureObj3() { if (!m_obj3) const_cast&>(m_obj3) = RefCountable::create(); return *m_obj3; } RefCountable& ensureObj4() { if (!m_obj4) const_cast&>(m_obj4) = RefCountable::create(); if (auto* next = m_obj4->next()) { // expected-warning@-1{{Local variable 'next' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} return *next; } return *m_obj4; } RefCountable* ensureObj5() { if (!m_obj5) const_cast&>(m_obj5) = RefCountable::create(); if (m_obj5->next()) return nullptr; return m_obj5.get(); } private: const RefPtr m_obj1; RefPtr m_obj2; const RefPtr m_obj3; const RefPtr m_obj4; const RefPtr m_obj5; }; void Foo::bar() { auto* obj1 = m_obj1.get(); obj1->method(); auto* obj2 = m_obj2.get(); // expected-warning@-1{{Local variable 'obj2' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} obj2->method(); auto& obj3 = ensureObj3(); obj3.method(); auto& obj4 = ensureObj4(); // expected-warning@-1{{Local variable 'obj4' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} obj4.method(); auto* obj5 = ensureObj5(); } } // namespace local_vars_const_refptr_member namespace local_vars_const_ref_member { class Foo { public: Foo(); void bar(); private: const Ref m_obj1; Ref m_obj2; }; void Foo::bar() { auto& obj1 = m_obj1.get(); obj1.method(); auto& obj2 = m_obj2.get(); // expected-warning@-1{{Local variable 'obj2' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} obj2.method(); } } // namespace local_vars_const_ref_member namespace call_args_const_unique_ptr { class Foo { public: Foo(); void bar(); private: const std::unique_ptr m_obj1; std::unique_ptr m_obj2; }; void Foo::bar() { auto* obj1 = m_obj1.get(); obj1->method(); auto* obj2 = m_obj2.get(); // expected-warning@-1{{Local variable 'obj2' is uncounted and unsafe [alpha.webkit.UncountedLocalVarsChecker]}} obj2->method(); } } // namespace call_args_const_unique_ptr