104 lines · cpp
1// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s2// expected-no-diagnostics3 4extern void __assert_fail (__const char *__assertion, __const char *__file,5 unsigned int __line, __const char *__function)6__attribute__ ((__noreturn__));7#define assert(expr) \8((expr) ? (void)(0) : __assert_fail (#expr, __FILE__, __LINE__, __func__))9 10class ButterFly {11private:12 ButterFly() { }13public:14 int triggerderef() {15 return 0;16 }17};18ButterFly *getInP();19class X{20 ButterFly *p;21 void setP(ButterFly *inP) {22 if(inP)23 ;24 p = inP;25 };26 void subtest1() {27 ButterFly *inP = getInP();28 setP(inP);29 }30 int subtest2() {31 int c = p->triggerderef(); // no-warning32 return c;33 }34 int test() {35 subtest1();36 return subtest2();37 }38};39 40typedef const int *Ty;41extern42Ty notNullArg(Ty cf) __attribute__((nonnull));43typedef const void *CFTypeRef;44extern Ty getTyVal();45inline void radar13224271_callee(Ty def, Ty& result ) {46 result = def;47 // Clearly indicates that result cannot be 0 if def is not NULL.48 assert( (result != 0) || (def == 0) );49}50void radar13224271_caller()51{52 Ty value;53 radar13224271_callee(getTyVal(), value );54 notNullArg(value); // no-warning55}56 57struct Foo {58 int *ptr;59 Foo(int *p) {60 *p = 1; // no-warning61 }62};63void idc(int *p3) {64 if (p3)65 ;66}67int *retNull() {68 return 0;69}70void test(int *p1, int *p2) {71 idc(p1);72 Foo f(p1);73}74 75struct Bar {76 int x;77};78void idcBar(Bar *b) {79 if (b)80 ;81}82void testRefToField(Bar *b) {83 idcBar(b);84 int &x = b->x; // no-warning85 x = 5;86}87 88namespace get_deref_expr_with_cleanups {89struct S {90~S();91};92S *conjure();93// The argument won't be used, but it'll cause cleanups94// to appear around the call site.95S *get_conjured(S _) {96 S *s = conjure();97 if (s) {}98 return s;99}100void test_conjured() {101 S &s = *get_conjured(S()); // no-warning102}103} // namespace get_deref_expr_with_cleanups104