1 | // RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify -analyzer-config eagerly-assume=false %s |
2 | |
3 | void clang_analyzer_eval(int); |
4 | void clang_analyzer_warnIfReached(); |
5 | |
6 | void f(void) { |
7 | void (*p)(void); |
8 | p = f; |
9 | p = &f; |
10 | p(); |
11 | (*p)(); |
12 | } |
13 | |
14 | void g(void (*fp)(void)); |
15 | |
16 | void f2() { |
17 | g(f); |
18 | } |
19 | |
20 | void f3(void (*f)(void), void (*g)(void)) { |
21 | clang_analyzer_eval(!f); // expected-warning{{UNKNOWN}} |
22 | f(); |
23 | clang_analyzer_eval(!f); // expected-warning{{FALSE}} |
24 | |
25 | clang_analyzer_eval(!g); // expected-warning{{UNKNOWN}} |
26 | (*g)(); |
27 | clang_analyzer_eval(!g); // expected-warning{{FALSE}} |
28 | } |
29 | |
30 | void nullFunctionPointerConstant() { |
31 | void (*f)(void) = 0; |
32 | f(); // expected-warning{{Called function pointer is null}} |
33 | clang_analyzer_warnIfReached(); // no-warning |
34 | } |
35 | |
36 | void nullFunctionPointerConstraint(void (*f)(void)) { |
37 | if (f) |
38 | return; |
39 | f(); // expected-warning{{Called function pointer is null}} |
40 | clang_analyzer_warnIfReached(); // no-warning |
41 | } |
42 | |