Home | History | Annotate | Download | only in Analysis
      1 // RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.core,debug.ExprInspection -analyzer-store=region -verify %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