// RUN: clang -analyze -checker-cfref --analyzer-store-basic --verify -fblocks %s && // RUN: clang -analyze -checker-cfref --analyzer-store-region --verify -fblocks %s // Reduced test case from crash in @class NSObject; @interface A @end @implementation A - (void)foo:(void (^)(NSObject *x))block { if (!((block != ((void *)0)))) {} } @end // Reduced test case from crash in PR 2796; // http://llvm.org/bugs/show_bug.cgi?id=2796 unsigned foo(unsigned x) { return __alignof__((x)) + sizeof(x); } // Improvement to path-sensitivity involving compound assignments. // Addresses false positive in // unsigned r6268365Aux(); void r6268365() { unsigned x = 0; x &= r6268365Aux(); unsigned j = 0; if (x == 0) ++j; if (x == 0) x = x / j; // no-warning } void divzeroassume(unsigned x, unsigned j) { x /= j; if (j == 0) x /= 0; // no-warning if (j == 0) x /= j; // no-warning if (j == 0) x = x / 0; // no-warning } void divzeroassumeB(unsigned x, unsigned j) { x = x / j; if (j == 0) x /= 0; // no-warning if (j == 0) x /= j; // no-warning if (j == 0) x = x / 0; // no-warning } // InitListExpr processing typedef float __m128 __attribute__((__vector_size__(16), __may_alias__)); __m128 return128() { // This compound literal has a Vector type. We currently just // return UnknownVal. return __extension__(__m128) { 0.0f, 0.0f, 0.0f, 0.0f }; } typedef long long __v2di __attribute__ ((__vector_size__ (16))); typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__)); __m128i vec128i(long long __q1, long long __q0) { // This compound literal returns true for both isVectorType() and // isIntegerType(). return __extension__ (__m128i)(__v2di){ __q0, __q1 }; } // Zero-sized VLAs. void check_zero_sized_VLA(int x) { if (x) return; int vla[x]; // expected-warning{{VLAs with no elements have undefined behavior}} } void check_uninit_sized_VLA() { int x; int vla[x]; // expected-warning{{The expression used to specify the number of elements in the VLA 'vla' evaluates to an undefined or garbage value.}} } // sizeof(void) // - Tests a regression reported in PR 3211: http://llvm.org/bugs/show_bug.cgi?id=3211 void handle_sizeof_void(unsigned flag) { int* p = 0; if (flag) { if (sizeof(void) == 1) return; // Infeasible. *p = 1; // no-warning } void* q; if (!flag) { if (sizeof(*q) == 1) return; // Infeasibe. *p = 1; // no-warning } // Infeasible. *p = 1; // no-warning } // PR 3422 void pr3422_helper(char *p); void pr3422() { char buf[100]; char *q = &buf[10]; pr3422_helper(&q[1]); } // PR 3543 (handle empty statement expressions) int pr_3543(void) { ({}); }