inline-defensive-checks.cpp revision a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40
10415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks// RUN: %clang_cc1 -analyze -analyzer-checker=core -verify %s 20415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks// expected-no-diagnostics 30415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks 4a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaksextern void __assert_fail (__const char *__assertion, __const char *__file, 5a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks unsigned int __line, __const char *__function) 6a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks__attribute__ ((__noreturn__)); 7a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks#define assert(expr) \ 8a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__)) 9a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks 100415998dd77986630efe8f1aed633519cc41e1f3Anna Zaksclass ButterFly { 110415998dd77986630efe8f1aed633519cc41e1f3Anna Zaksprivate: 120415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks ButterFly() { } 130415998dd77986630efe8f1aed633519cc41e1f3Anna Zakspublic: 140415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks int triggerderef() { 150415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks return 0; 160415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks } 170415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks}; 180415998dd77986630efe8f1aed633519cc41e1f3Anna ZaksButterFly *getInP(); 190415998dd77986630efe8f1aed633519cc41e1f3Anna Zaksclass X{ 200415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks ButterFly *p; 210415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks void setP(ButterFly *inP) { 220415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks if(inP) 230415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks ; 240415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks p = inP; 250415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks }; 260415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks void subtest1() { 270415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks ButterFly *inP = getInP(); 280415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks setP(inP); 290415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks } 300415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks int subtest2() { 310415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks int c = p->triggerderef(); // no-warning 320415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks return c; 330415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks } 340415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks int test() { 350415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks subtest1(); 360415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks return subtest2(); 370415998dd77986630efe8f1aed633519cc41e1f3Anna Zaks } 38a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks}; 39a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks 40a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zakstypedef const int *Ty; 41a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaksextern 42a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna ZaksTy notNullArg(Ty cf) __attribute__((nonnull)); 43a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zakstypedef const void *CFTypeRef; 44a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaksextern Ty getTyVal(); 45a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaksinline void radar13224271_callee(Ty def, Ty& result ) { 46a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks result = def; 47a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks // Clearly indicates that result cannot be 0 if def is not NULL. 48a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks assert( (result != 0) || (def == 0) ); 49a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks} 50a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaksvoid radar13224271_caller() 51a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks{ 52a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks Ty value; 53a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks radar13224271_callee(getTyVal(), value ); 54a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks notNullArg(value); // no-warning 55a4bb4f6ca8dd31ad96cb9526a5abe1273f18ff40Anna Zaks}