1// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify %s 2 3void clang_analyzer_eval(int); 4void clang_analyzer_warnIfReached(); 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() { 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() { 31 void (*f)(void) = 0; 32 f(); // expected-warning{{Called function pointer is null}} 33 clang_analyzer_warnIfReached(); // no-warning 34} 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-warning 41} 42