1 // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify -std=c++2a %s 2 3 4 static const unsigned long long scull = 0; static_int()5void static_int() 6 { 7 *(int*)scull = 0; // expected-warning{{Dereference of null pointer}} 8 } 9 10 const unsigned long long cull = 0; const_int()11void const_int() 12 { 13 *(int*)cull = 0; // expected-warning{{Dereference of null pointer}} 14 } 15 16 static int * const spc = 0; static_ptr()17void static_ptr() 18 { 19 *spc = 0; // expected-warning{{Dereference of null pointer}} 20 } 21 22 int * const pc = 0; const_ptr()23void const_ptr() 24 { 25 *pc = 0; // expected-warning{{Dereference of null pointer}} 26 } 27 28 const unsigned long long cull_nonnull = 4; nonnull_int()29void nonnull_int() 30 { 31 *(int*)(cull_nonnull - 4) = 0; // expected-warning{{Dereference of null pointer}} 32 } 33 34 int * const pc_nonnull = (int*)sizeof(int); nonnull_ptr()35void nonnull_ptr() 36 { 37 *(pc_nonnull - 1) = 0; // expected-warning{{Dereference of null pointer}} 38 } 39 40 int * const constcast = const_cast<int * const>((int*)sizeof(int)); cast1()41void cast1() 42 { 43 *(constcast - 1) = 0; // expected-warning{{Dereference of null pointer}} 44 } 45 46 int * const recast = reinterpret_cast<int*>(sizeof(int)); cast2()47void cast2() 48 { 49 *(recast - 1) = 0; // expected-warning{{Dereference of null pointer}} 50 } 51 52 int * const staticcast = static_cast<int * const>((int*)sizeof(int)); cast3()53void cast3() 54 { 55 *(staticcast - 1) = 0; // expected-warning{{Dereference of null pointer}} 56 } 57 58 struct Foo { int a; }; 59 Foo * const dyncast = dynamic_cast<Foo * const>((Foo*)sizeof(Foo)); cast4()60void cast4() 61 { 62 // Do not handle dynamic_cast for now, because it may change the pointer value. 63 (dyncast - 1)->a = 0; // no-warning 64 } 65 66 typedef int * const intptrconst; 67 int * const funccast = intptrconst(sizeof(int)); cast5()68void cast5() 69 { 70 *(funccast - 1) = 0; // expected-warning{{Dereference of null pointer}} 71 } 72 73 struct S1 74 { 75 int * p; 76 }; 77 const S1 s1 = { 78 .p = (int*)sizeof(int) 79 }; conststruct()80void conststruct() 81 { 82 *(s1.p - 1) = 0; // expected-warning{{Dereference of null pointer}} 83 } 84 85 struct S2 86 { 87 int * const p; 88 }; 89 S2 s2 = { 90 .p = (int*)sizeof(int) 91 }; constfield()92void constfield() 93 { 94 *(s2.p - 1) = 0; // expected-warning{{Dereference of null pointer}} 95 } 96 97 int * const parr[1] = { (int*)sizeof(int) }; constarr()98void constarr() 99 { 100 *(parr[0] - 1) = 0; // expected-warning{{Dereference of null pointer}} 101 } 102 103 struct S3 104 { 105 int * p = (int*)sizeof(int); 106 }; recordinit()107void recordinit() 108 { 109 S3 s3; 110 *(s3.p - 1) = 0; // expected-warning{{Dereference of null pointer}} 111 } 112 113 extern int ext_int; 114 update_original_declaration()115void update_original_declaration() { 116 ext_int = 2; 117 } 118 119 extern int ext_int; 120 test_redeclaration()121int test_redeclaration() { 122 ext_int = 1; 123 update_original_declaration(); 124 int int_int = 3 / (ext_int - 1); // no-warning 125 return int_int / (ext_int - 2); // expected-warning{{Division by zero}} 126 } 127