brintos

brintos / llvm-project-archived public Read only

0
0
Text · 8.9 KiB · 2984f8b Raw
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