blob: 78afb45da69604bc7d557dcf2c159ef9bfcb60fa [file] [log] [blame]
Ted Kremenek722398f2012-08-24 20:39:55 +00001// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify %s
Jordan Rose83e40492012-08-15 21:56:23 +00002
3void clang_analyzer_eval(int);
Jordan Rose9db2d9a2013-10-03 16:57:03 +00004void clang_analyzer_warnIfReached();
Zhongxing Xuda84f682008-10-22 14:39:20 +00005
6void f(void) {
7 void (*p)(void);
8 p = f;
Tom Care9026d4b2010-08-30 19:25:43 +00009 p = &f;
Zhongxing Xuda84f682008-10-22 14:39:20 +000010 p();
11 (*p)();
12}
Zhongxing Xub32af432008-10-27 09:21:27 +000013
14void g(void (*fp)(void));
15
16void f2() {
17 g(f);
18}
Jordan Rose83e40492012-08-15 21:56:23 +000019
20void 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}
Jordan Rose44e066c2013-10-02 01:20:28 +000029
30void nullFunctionPointerConstant() {
31 void (*f)(void) = 0;
32 f(); // expected-warning{{Called function pointer is null}}
Jordan Rose9db2d9a2013-10-03 16:57:03 +000033 clang_analyzer_warnIfReached(); // no-warning
Jordan Rose44e066c2013-10-02 01:20:28 +000034}
35
36void nullFunctionPointerConstraint(void (*f)(void)) {
37 if (f)
38 return;
39 f(); // expected-warning{{Called function pointer is null}}
Jordan Rose9db2d9a2013-10-03 16:57:03 +000040 clang_analyzer_warnIfReached(); // no-warning
Jordan Rose44e066c2013-10-02 01:20:28 +000041}