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