365 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=alpha.webkit.UncheckedLocalVarsChecker -verify %s2 3#include "mock-types.h"4#include "mock-system-header.h"5 6void someFunction();7 8namespace raw_ptr {9void foo() {10 CheckedObj *bar;11 // FIXME: later on we might warn on uninitialized vars too12}13 14void bar(CheckedObj *) {}15} // namespace raw_ptr16 17namespace reference {18void foo_ref() {19 CheckedObj automatic;20 CheckedObj &bar = automatic;21 // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}22 someFunction();23 bar.method();24}25 26void foo_ref_trivial() {27 CheckedObj automatic;28 CheckedObj &bar = automatic;29}30 31void bar_ref(CheckedObj &) {}32} // namespace reference33 34namespace guardian_scopes {35void foo1() {36 CheckedPtr<CheckedObj> foo;37 { CheckedObj *bar = foo.get(); }38}39 40void foo2() {41 CheckedPtr<CheckedObj> foo;42 // missing embedded scope here43 CheckedObj *bar = foo.get();44 // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}45 someFunction();46 bar->method();47}48 49void foo3() {50 CheckedPtr<CheckedObj> foo;51 {52 { CheckedObj *bar = foo.get(); }53 }54}55 56void foo4() {57 {58 CheckedPtr<CheckedObj> foo;59 { CheckedObj *bar = foo.get(); }60 }61}62 63void foo5() {64 CheckedPtr<CheckedObj> foo;65 auto* bar = foo.get();66 bar->trivial();67}68 69void foo6() {70 CheckedPtr<CheckedObj> foo;71 auto* bar = foo.get();72 // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}73 bar->method();74}75 76struct SelfReferencingStruct {77 SelfReferencingStruct* ptr;78 CheckedObj* obj { nullptr };79};80 81void foo7(CheckedObj* obj) {82 SelfReferencingStruct bar = { &bar, obj };83 bar.obj->method();84}85 86} // namespace guardian_scopes87 88namespace auto_keyword {89class Foo {90 CheckedObj *provide_ref_ctnbl();91 92 void evil_func() {93 CheckedObj *bar = provide_ref_ctnbl();94 // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}95 auto *baz = provide_ref_ctnbl();96 // expected-warning@-1{{Local variable 'baz' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}97 auto *baz2 = this->provide_ref_ctnbl();98 // expected-warning@-1{{Local variable 'baz2' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}99 [[clang::suppress]] auto *baz_suppressed = provide_ref_ctnbl(); // no-warning100 }101 102 void func() {103 CheckedObj *bar = provide_ref_ctnbl();104 // expected-warning@-1{{Local variable 'bar' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}105 if (bar)106 bar->method();107 }108};109} // namespace auto_keyword110 111namespace guardian_casts {112void foo1() {113 CheckedPtr<CheckedObj> foo;114 {115 CheckedObj *bar = downcast<CheckedObj>(foo.get());116 bar->method();117 }118 foo->method();119}120 121void foo2() {122 CheckedPtr<CheckedObj> foo;123 {124 CheckedObj *bar =125 static_cast<CheckedObj *>(downcast<CheckedObj>(foo.get()));126 someFunction();127 }128}129} // namespace guardian_casts130 131namespace guardian_ref_conversion_operator {132void foo() {133 CheckedRef<CheckedObj> rc;134 {135 CheckedObj &rr = rc;136 rr.method();137 someFunction();138 }139}140} // namespace guardian_ref_conversion_operator141 142namespace ignore_for_if {143CheckedObj *provide_ref_ctnbl() { return nullptr; }144 145void foo() {146 // no warnings147 if (CheckedObj *a = provide_ref_ctnbl())148 a->trivial();149 for (CheckedObj *b = provide_ref_ctnbl(); b != nullptr;)150 b->trivial();151 CheckedObj *array[1];152 for (CheckedObj *c : array)153 c->trivial();154 while (CheckedObj *d = provide_ref_ctnbl())155 d->trivial();156 do {157 CheckedObj *e = provide_ref_ctnbl();158 e->trivial();159 } while (1);160 someFunction();161}162 163void bar() {164 if (CheckedObj *a = provide_ref_ctnbl()) {165 // expected-warning@-1{{Local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}166 a->method(); 167 }168 for (CheckedObj *b = provide_ref_ctnbl(); b != nullptr;) {169 // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}170 b->method();171 }172 CheckedObj *array[1];173 for (CheckedObj *c : array) {174 // expected-warning@-1{{Local variable 'c' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}175 c->method();176 }177 178 while (CheckedObj *d = provide_ref_ctnbl()) {179 // expected-warning@-1{{Local variable 'd' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}180 d->method();181 }182 do {183 CheckedObj *e = provide_ref_ctnbl();184 // expected-warning@-1{{Local variable 'e' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}185 e->method();186 } while (1);187 someFunction();188}189 190} // namespace ignore_for_if191 192namespace ignore_system_headers {193 194CheckedObj *provide_checkable();195 196void system_header() {197 localVar<CheckedObj>(provide_checkable);198}199 200} // ignore_system_headers201 202namespace conditional_op {203CheckedObj *provide_checkable();204bool bar();205 206void foo() {207 CheckedObj *a = bar() ? nullptr : provide_checkable();208 // expected-warning@-1{{Local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}209 CheckedPtr<CheckedObj> b = provide_checkable();210 {211 CheckedObj* c = bar() ? nullptr : b.get();212 c->method();213 CheckedObj* d = bar() ? b.get() : nullptr;214 d->method();215 }216}217 218} // namespace conditional_op219 220namespace local_assignment_basic {221 222CheckedObj *provide_checkable();223 224void foo(CheckedObj* a) {225 CheckedObj* b = a;226 // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}227 if (b->trivial())228 b = provide_checkable();229}230 231void bar(CheckedObj* a) {232 CheckedObj* b;233 // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}234 b = provide_checkable();235}236 237void baz() {238 CheckedPtr a = provide_checkable();239 {240 CheckedObj* b = a.get();241 // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}242 b = provide_checkable();243 }244}245 246} // namespace local_assignment_basic247 248namespace local_assignment_to_parameter {249 250CheckedObj *provide_checkable();251void someFunction();252 253void foo(CheckedObj* a) {254 a = provide_checkable();255 // expected-warning@-1{{Assignment to an unchecked parameter 'a' is unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}256 someFunction();257 a->method();258}259 260} // namespace local_assignment_to_parameter261 262namespace local_assignment_to_static_local {263 264CheckedObj *provide_checkable();265void someFunction();266 267void foo() {268 static CheckedObj* a = nullptr;269 // expected-warning@-1{{Static local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}270 a = provide_checkable();271 someFunction();272 a->method();273}274 275} // namespace local_assignment_to_static_local276 277namespace local_assignment_to_global {278 279CheckedObj *provide_ref_cntbl();280void someFunction();281 282CheckedObj* g_a = nullptr;283// expected-warning@-1{{Global variable 'local_assignment_to_global::g_a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}284 285void foo() {286 g_a = provide_ref_cntbl();287 someFunction();288 g_a->method();289}290 291} // namespace local_assignment_to_global292 293namespace member_var {294 295 struct WrapperObj {296 CheckedObj checked;297 CheckedObj& checkedRef;298 void foo() {299 auto *a = &checked;300 a->method();301 auto *b = &checkedRef;302 // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}303 b->method();304 }305 306 void bar(WrapperObj& wrapper) {307 CheckedObj* ptr = &wrapper.checked;308 // expected-warning@-1{{Local variable 'ptr' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}309 ptr->method();310 }311 };312 313}314 315namespace local_refcountable_checkable_object {316 317RefCountableAndCheckable* provide_obj();318 319void local_raw_ptr() {320 RefCountableAndCheckable* a = nullptr;321 // expected-warning@-1{{Local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}322 a = provide_obj();323 a->method();324}325 326void local_checked_ptr() {327 RefPtr<RefCountableAndCheckable> a = nullptr;328 a = provide_obj();329 a->method();330}331 332void local_var_with_guardian_checked_ptr() {333 RefPtr<RefCountableAndCheckable> a = provide_obj();334 {335 auto* b = a.get();336 b->method();337 }338}339 340void local_var_with_guardian_checked_ptr_with_assignment() {341 RefPtr<RefCountableAndCheckable> a = provide_obj();342 {343 RefCountableAndCheckable* b = a.get();344 // expected-warning@-1{{Local variable 'b' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}345 b = provide_obj();346 b->method();347 }348}349 350void local_var_with_guardian_checked_ref() {351 Ref<RefCountableAndCheckable> a = *provide_obj();352 {353 RefCountableAndCheckable& b = a;354 b.method();355 }356}357 358void static_var() {359 static RefCountableAndCheckable* a = nullptr;360 // expected-warning@-1{{Static local variable 'a' is unchecked and unsafe [alpha.webkit.UncheckedLocalVarsChecker]}}361 a = provide_obj();362}363 364} // namespace local_refcountable_checkable_object365