42 lines · c
1// RUN: %clang_analyze_cc1 -analyzer-checker=core,alpha.core,debug.ExprInspection -verify -analyzer-config eagerly-assume=false %s2 3void clang_analyzer_eval(int);4void clang_analyzer_warnIfReached(void);5 6void f(void) {7 void (*p)(void);8 p = f;9 p = &f;10 p();11 (*p)();12}13 14void g(void (*fp)(void));15 16void f2(void) {17 g(f);18}19 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}29 30void nullFunctionPointerConstant(void) {31 void (*f)(void) = 0;32 f(); // expected-warning{{Called function pointer is null}}33 clang_analyzer_warnIfReached(); // no-warning34}35 36void nullFunctionPointerConstraint(void (*f)(void)) {37 if (f)38 return;39 f(); // expected-warning{{Called function pointer is null}}40 clang_analyzer_warnIfReached(); // no-warning41}42