103 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncheckedCallArgsChecker -verify %s2 3#include "mock-types.h"4 5namespace call_args_const_checkedptr_member {6 7class Foo {8public:9 Foo();10 void bar();11 12private:13 const CheckedPtr<CheckedObj> m_obj1;14 CheckedPtr<CheckedObj> m_obj2;15};16 17void Foo::bar() {18 m_obj1->method();19 m_obj2->method();20 // expected-warning@-1{{Call argument for 'this' parameter is unchecked and unsafe}}21}22 23} // namespace call_args_const_checkedptr_member24 25namespace call_args_const_checkedref_member {26 27class Foo {28public:29 Foo();30 void bar();31 32private:33 const CheckedRef<CheckedObj> m_obj1;34 CheckedRef<CheckedObj> m_obj2;35};36 37void Foo::bar() {38 m_obj1->method();39 m_obj2->method();40 // expected-warning@-1{{Call argument for 'this' parameter is unchecked and unsafe}}41}42 43} // namespace call_args_const_checkedref_member44 45namespace call_args_const_unique_ptr {46 47class Foo {48public:49 Foo();50 void bar();51 52 CheckedObj& ensureObj3() {53 if (!m_obj3)54 const_cast<std::unique_ptr<CheckedObj>&>(m_obj3) = new CheckedObj;55 return *m_obj3;56 }57 58 CheckedObj& badEnsureObj4() {59 if (!m_obj4)60 const_cast<std::unique_ptr<CheckedObj>&>(m_obj4) = new CheckedObj;61 if (auto* next = m_obj4->next())62 return *next;63 return *m_obj4;64 }65 66 CheckedObj* ensureObj5() {67 if (!m_obj5)68 const_cast<std::unique_ptr<CheckedObj>&>(m_obj5) = new CheckedObj;69 if (m_obj5->next())70 return nullptr;71 return m_obj5.get();72 }73 74 CheckedObj* ensureObj6() {75 if (!m_obj6)76 const_cast<std::unique_ptr<CheckedObj>&>(m_obj6) = new CheckedObj;77 if (m_obj6->next())78 return (CheckedObj *)0;79 return m_obj6.get();80 }81 82private:83 const std::unique_ptr<CheckedObj> m_obj1;84 std::unique_ptr<CheckedObj> m_obj2;85 const std::unique_ptr<CheckedObj> m_obj3;86 const std::unique_ptr<CheckedObj> m_obj4;87 const std::unique_ptr<CheckedObj> m_obj5;88 const std::unique_ptr<CheckedObj> m_obj6;89};90 91void Foo::bar() {92 m_obj1->method();93 m_obj2->method();94 // expected-warning@-1{{Call argument for 'this' parameter is unchecked and unsafe}}95 ensureObj3().method();96 badEnsureObj4().method();97 // expected-warning@-1{{Call argument for 'this' parameter is unchecked and unsafe}}98 ensureObj5()->method();99 ensureObj6()->method();100}101 102} // namespace call_args_const_unique_ptr103