2011-05-26 07:57:29 +08:00
|
|
|
// RUN: %clang_cc1 -triple x86_64-apple-darwin10 -analyze -disable-free -analyzer-eagerly-assume -analyzer-checker=core -analyzer-checker=deadcode -verify %s
|
|
|
|
|
|
|
|
unsigned long strlen(const char *);
|
|
|
|
|
|
|
|
int size_rdar9373039 = 1;
|
|
|
|
int rdar9373039() {
|
|
|
|
int x;
|
|
|
|
int j = 0;
|
|
|
|
|
|
|
|
for (int i = 0 ; i < size_rdar9373039 ; ++i)
|
|
|
|
x = 1;
|
|
|
|
|
|
|
|
// strlen doesn't invalidate the value of 'size_rdar9373039'.
|
|
|
|
int extra = (2 + strlen ("Clang") + ((4 - ((unsigned int) (2 + strlen ("Clang")) % 4)) % 4)) + (2 + strlen ("1.0") + ((4 - ((unsigned int) (2 + strlen ("1.0")) % 4)) % 4));
|
|
|
|
|
|
|
|
for (int i = 0 ; i < size_rdar9373039 ; ++i)
|
|
|
|
j += x; // no-warning
|
|
|
|
|
|
|
|
return j;
|
|
|
|
}
|
|
|
|
|
|
|
|
int foo_rdar9373039(const char *);
|
|
|
|
|
|
|
|
int rdar93730392() {
|
|
|
|
int x;
|
|
|
|
int j = 0;
|
|
|
|
|
|
|
|
for (int i = 0 ; i < size_rdar9373039 ; ++i)
|
|
|
|
x = 1;
|
|
|
|
|
|
|
|
int extra = (2 + foo_rdar9373039 ("Clang") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("Clang")) % 4)) % 4)) + (2 + foo_rdar9373039 ("1.0") + ((4 - ((unsigned int) (2 + foo_rdar9373039 ("1.0")) % 4)) % 4)); // expected-warning {{never read}}
|
|
|
|
|
|
|
|
for (int i = 0 ; i < size_rdar9373039 ; ++i)
|
|
|
|
j += x; // expected-warning {{garbage}}
|
|
|
|
|
|
|
|
return j;
|
|
|
|
}
|
|
|
|
|
2011-06-09 06:47:39 +08:00
|
|
|
|
|
|
|
int PR8962 (int *t) {
|
|
|
|
// This should look through the __extension__ no-op.
|
|
|
|
if (__extension__ (t)) return 0;
|
|
|
|
return *t; // expected-warning {{null pointer}}
|
|
|
|
}
|
|
|
|
|
|
|
|
int PR8962_b (int *t) {
|
|
|
|
// This should still ignore the nested casts
|
|
|
|
// which aren't handled by a single IgnoreParens()
|
|
|
|
if (((int)((int)t))) return 0;
|
|
|
|
return *t; // expected-warning {{null pointer}}
|
|
|
|
}
|
|
|
|
|
2011-06-09 13:44:04 +08:00
|
|
|
int PR8962_c (int *t) {
|
|
|
|
// If the last element in a StmtExpr was a ParenExpr, it's still live
|
|
|
|
if (({ (t ? (_Bool)0 : (_Bool)1); })) return 0;
|
|
|
|
return *t; // no-warning
|
|
|
|
}
|
|
|
|
|
|
|
|
int PR8962_d (int *t) {
|
|
|
|
// If the last element in a StmtExpr is an __extension__, it's still live
|
|
|
|
if (({ __extension__(t ? (_Bool)0 : (_Bool)1); })) return 0;
|
|
|
|
return *t; // no-warning
|
|
|
|
}
|
|
|
|
|
2011-06-10 16:49:37 +08:00
|
|
|
int PR8962_e (int *t) {
|
|
|
|
// Redundant casts can mess things up!
|
|
|
|
// Environment used to skip through NoOp casts, but LiveVariables didn't!
|
|
|
|
if (({ (t ? (int)(int)0L : (int)(int)1L); })) return 0;
|
|
|
|
return *t; // no-warning
|
|
|
|
}
|
|
|
|
|
|
|
|
int PR8962_f (int *t) {
|
|
|
|
// The StmtExpr isn't a block-level expression here,
|
|
|
|
// the __extension__ is. But the value should be attached to the StmtExpr
|
|
|
|
// anyway. Make sure the block-level check is /before/ IgnoreParens.
|
|
|
|
if ( __extension__({
|
|
|
|
_Bool r;
|
|
|
|
if (t) r = 0;
|
|
|
|
else r = 1;
|
|
|
|
r;
|
|
|
|
}) ) return 0;
|
|
|
|
return *t; // no-warning
|
|
|
|
}
|
2011-10-21 03:33:06 +08:00
|
|
|
|
|
|
|
// This previously crashed logic in the analyzer engine when evaluating locations.
|
|
|
|
void rdar10308201_aux(unsigned val);
|
|
|
|
void rdar10308201 (int valA, void *valB, unsigned valC) {
|
|
|
|
unsigned actual_base, lines;
|
|
|
|
if (valC == 0) {
|
|
|
|
actual_base = (unsigned)valB;
|
|
|
|
for (;;) {
|
|
|
|
if (valA & (1<<0))
|
|
|
|
rdar10308201_aux(actual_base);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|