xref: /aosp_15_r20/external/clang/test/Analysis/cxx-crashes.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -verify %s
2*67e74705SXin Li // REQUIRES: LP64
3*67e74705SXin Li 
4*67e74705SXin Li void clang_analyzer_eval(bool);
5*67e74705SXin Li 
f1(char * dst)6*67e74705SXin Li int f1(char *dst) {
7*67e74705SXin Li   char *p = dst + 4;
8*67e74705SXin Li   char *q = dst + 3;
9*67e74705SXin Li   return !(q >= p);
10*67e74705SXin Li }
11*67e74705SXin Li 
f2(char * c)12*67e74705SXin Li long f2(char *c) {
13*67e74705SXin Li   return long(c) & 1;
14*67e74705SXin Li }
15*67e74705SXin Li 
f3()16*67e74705SXin Li bool f3() {
17*67e74705SXin Li   return !false;
18*67e74705SXin Li }
19*67e74705SXin Li 
f4(int * w)20*67e74705SXin Li void *f4(int* w) {
21*67e74705SXin Li   return reinterpret_cast<void*&>(w);
22*67e74705SXin Li }
23*67e74705SXin Li 
24*67e74705SXin Li namespace {
25*67e74705SXin Li 
26*67e74705SXin Li struct A { };
27*67e74705SXin Li struct B {
operator A__anonbcc681d70111::B28*67e74705SXin Li   operator A() { return A(); }
29*67e74705SXin Li };
30*67e74705SXin Li 
f(char * dst)31*67e74705SXin Li A f(char *dst) {
32*67e74705SXin Li   B b;
33*67e74705SXin Li   return b;
34*67e74705SXin Li }
35*67e74705SXin Li 
36*67e74705SXin Li }
37*67e74705SXin Li 
38*67e74705SXin Li namespace {
39*67e74705SXin Li 
40*67e74705SXin Li struct S {
41*67e74705SXin Li     void *p;
42*67e74705SXin Li };
43*67e74705SXin Li 
f(S * w)44*67e74705SXin Li void *f(S* w) {
45*67e74705SXin Li     return &reinterpret_cast<void*&>(*w);
46*67e74705SXin Li }
47*67e74705SXin Li 
48*67e74705SXin Li }
49*67e74705SXin Li 
50*67e74705SXin Li namespace {
51*67e74705SXin Li 
52*67e74705SXin Li struct C {
53*67e74705SXin Li   void *p;
54*67e74705SXin Li   static void f();
55*67e74705SXin Li };
56*67e74705SXin Li 
f()57*67e74705SXin Li void C::f() { }
58*67e74705SXin Li 
59*67e74705SXin Li }
60*67e74705SXin Li 
61*67e74705SXin Li 
vla(int n)62*67e74705SXin Li void vla(int n) {
63*67e74705SXin Li   int nums[n];
64*67e74705SXin Li   nums[0] = 1;
65*67e74705SXin Li   clang_analyzer_eval(nums[0] == 1); // expected-warning{{TRUE}}
66*67e74705SXin Li 
67*67e74705SXin Li   // This used to fail with MallocChecker on, and /only/ in C++ mode.
68*67e74705SXin Li   // This struct is POD, though, so it should be fine to put it in a VLA.
69*67e74705SXin Li   struct { int x; } structs[n];
70*67e74705SXin Li   structs[0].x = 1;
71*67e74705SXin Li   clang_analyzer_eval(structs[0].x == 1); // expected-warning{{TRUE}}
72*67e74705SXin Li }
73*67e74705SXin Li 
74*67e74705SXin Li void useIntArray(int []);
testIntArrayLiteral()75*67e74705SXin Li void testIntArrayLiteral() {
76*67e74705SXin Li   useIntArray((int []){ 1, 2, 3 });
77*67e74705SXin Li }
78*67e74705SXin Li 
79