blob: f221f8b989f1b32fee4d1c08e0d153fb80efba2e (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
// 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 <rdar://problem/6253157>
@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 <rdar://problem/6268365>
//
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
}
|