1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify -std=c99 -Dbool=_Bool -Wno-bool-conversion %s |
2 | // RUN: %clang_analyze_cc1 -analyzer-checker=core -verify -x c++ -Wno-bool-conversion %s |
3 | |
4 | typedef __INTPTR_TYPE__ intptr_t; |
5 | char const *p; |
6 | |
7 | void f0() { |
8 | char const str[] = "This will change"; |
9 | p = str; |
10 | } // expected-warning{{Address of stack memory associated with local variable 'str' is still referred to by the global variable 'p' upon returning to the caller. This will be a dangling reference}} |
11 | |
12 | void f1() { |
13 | char const str[] = "This will change"; |
14 | p = str; |
15 | p = 0; // no-warning |
16 | } |
17 | |
18 | void f2() { |
19 | p = (const char *) __builtin_alloca(12); |
20 | } // expected-warning{{Address of stack memory allocated by call to alloca() on line 19 is still referred to by the global variable 'p' upon returning to the caller. This will be a dangling reference}} |
21 | |
22 | // PR 7383 - previously the stack address checker would crash on this example |
23 | // because it would attempt to do a direct load from 'pr7383_list'. |
24 | static int pr7383(__const char *__) |
25 | { |
26 | return 0; |
27 | } |
28 | extern __const char *__const pr7383_list[]; |
29 | |
30 | // Test that we catch multiple returns via globals when analyzing a function. |
31 | void test_multi_return() { |
32 | static int *a, *b; |
33 | int x; |
34 | a = &x; |
35 | b = &x; |
36 | } // expected-warning{{Address of stack memory associated with local variable 'x' is still referred to by the static variable 'a' upon returning}} expected-warning{{Address of stack memory associated with local variable 'x' is still referred to by the static variable 'b' upon returning}} |
37 | |
38 | intptr_t returnAsNonLoc() { |
39 | int x; |
40 | return (intptr_t)&x; // expected-warning{{Address of stack memory associated with local variable 'x' returned to caller}} expected-warning{{address of stack memory associated with local variable 'x' returned}} |
41 | } |
42 | |
43 | bool returnAsBool() { |
44 | int x; |
45 | return &x; // no-warning |
46 | } |
47 | |
48 | void assignAsNonLoc() { |
49 | extern intptr_t ip; |
50 | int x; |
51 | ip = (intptr_t)&x; |
52 | } // expected-warning{{Address of stack memory associated with local variable 'x' is still referred to by the global variable 'ip' upon returning}} |
53 | |
54 | void assignAsBool() { |
55 | extern bool b; |
56 | int x; |
57 | b = &x; |
58 | } // no-warning |
59 | |