misc-ps.m revision d427023c334fe03105d9359711a3df4d6f23b344
1// RUN: clang -analyze -checker-cfref --verify -fblocks %s
2
3// Reduced test case from crash in <rdar://problem/6253157>
4@class NSObject;
5@interface A @end
6@implementation A
7- (void)foo:(void (^)(NSObject *x))block {
8  if (!((block != ((void *)0)))) {}
9}
10@end
11
12// Reduced test case from crash in PR 2796;
13//  http://llvm.org/bugs/show_bug.cgi?id=2796
14
15unsigned foo(unsigned x) { return __alignof__((x)) + sizeof(x); }
16
17// Improvement to path-sensitivity involving compound assignments.
18//  Addresses false positive in <rdar://problem/6268365>
19//
20
21unsigned r6268365Aux();
22
23void r6268365() {
24  unsigned x = 0;
25  x &= r6268365Aux();
26  unsigned j = 0;
27    
28  if (x == 0) ++j;
29  if (x == 0) x = x / j; // no-warning
30}
31
32void divzeroassume(unsigned x, unsigned j) {  
33  x /= j;  
34  if (j == 0) x /= 0;     // no-warning
35  if (j == 0) x /= j;     // no-warning
36  if (j == 0) x = x / 0;  // no-warning
37}
38
39void divzeroassumeB(unsigned x, unsigned j) {  
40  x = x / j;  
41  if (j == 0) x /= 0;     // no-warning
42  if (j == 0) x /= j;     // no-warning
43  if (j == 0) x = x / 0;  // no-warning
44}
45
46// PR 2948 (testcase; crash on VisitLValue for union types)
47// http://llvm.org/bugs/show_bug.cgi?id=2948
48
49void checkaccess_union() {
50  int ret = 0, status;
51  if (((((__extension__ (((union {
52    __typeof (status) __in; int __i;}
53    )
54    {
55      .__in = (status)}
56      ).__i))) & 0xff00) >> 8) == 1)
57        ret = 1;
58}
59
60// InitListExpr processing
61
62typedef float __m128 __attribute__((__vector_size__(16), __may_alias__));
63__m128 return128() {
64  // This compound literal has a Vector type.  We currently just
65  // return UnknownVal.
66  return __extension__(__m128) { 0.0f, 0.0f, 0.0f, 0.0f };
67}
68
69typedef long long __v2di __attribute__ ((__vector_size__ (16)));
70typedef long long __m128i __attribute__ ((__vector_size__ (16), __may_alias__));
71__m128i vec128i(long long __q1, long long __q0) {
72  // This compound literal returns true for both isVectorType() and 
73  // isIntegerType().
74  return __extension__ (__m128i)(__v2di){ __q0, __q1 };
75}
76
77// Zero-sized VLAs.
78void check_zero_sized_VLA(int x) {
79  if (x)
80    return;
81
82  int vla[x]; // expected-warning{{VLAs with no elements have undefined behavior}}
83}
84
85void check_uninit_sized_VLA() {
86  int x;
87  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.}}
88}
89
90// sizeof(void)
91// - Tests a regression reported in PR 3211: http://llvm.org/bugs/show_bug.cgi?id=3211
92void handle_sizeof_void(unsigned flag) {
93  int* p = 0;
94
95  if (flag) {
96    if (sizeof(void) == 1)
97      return;
98    // Infeasible.
99    *p = 1; // no-warning
100  }
101  
102  void* q;
103  
104  if (!flag) {
105    if (sizeof(*q) == 1)
106      return;
107    // Infeasibe.
108    *p = 1; // no-warning
109  }
110    
111  // Infeasible.
112  *p = 1; // no-warning
113}
114
115