197 lines
3.4 KiB
Mathematica
197 lines
3.4 KiB
Mathematica
|
// RUN: %clang_analyze_cc1 -analyzer-config eagerly-assume=false %s -analyzer-checker=osx.cocoa.RetainCount,deadcode.DeadStores,core -analyzer-output=plist -analyzer-config deadcode.DeadStores:ShowFixIts=true -o %t.plist
|
|||
|
// RUN: %normalize_plist <%t.plist | diff -ub %S/Inputs/expected-plists/plist-output.m.plist -
|
|||
|
|
|||
|
void test_null_init(void) {
|
|||
|
int *p = 0;
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
void test_null_assign(void) {
|
|||
|
int *p;
|
|||
|
p = 0;
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
void test_null_assign_transitive(void) {
|
|||
|
int *p;
|
|||
|
p = 0;
|
|||
|
int *q = p;
|
|||
|
*q = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
void test_null_cond(int *p) {
|
|||
|
if (!p) {
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void test_null_cond_transitive(int *q) {
|
|||
|
if (!q) {
|
|||
|
int *p = q;
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
void test_null_field(void) {
|
|||
|
struct s { int *p; } x;
|
|||
|
x.p = 0;
|
|||
|
*(x.p) = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
void test_assumptions(int a, int b)
|
|||
|
{
|
|||
|
if (a == 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
if (b != 0) {
|
|||
|
return;
|
|||
|
}
|
|||
|
int *p = 0;
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
int *bar_cond_assign();
|
|||
|
int test_cond_assign() {
|
|||
|
int *p;
|
|||
|
if (p = bar_cond_assign())
|
|||
|
return 1;
|
|||
|
return *p;
|
|||
|
}
|
|||
|
|
|||
|
// The following previously crashed when generating extensive diagnostics.
|
|||
|
// <rdar://problem/10797980>
|
|||
|
@interface RDar10797980_help
|
|||
|
@property (readonly) int x;
|
|||
|
@end
|
|||
|
|
|||
|
@interface RDar10797980 {
|
|||
|
RDar10797980_help *y;
|
|||
|
}
|
|||
|
- (void) test;
|
|||
|
@end
|
|||
|
|
|||
|
@implementation RDar10797980
|
|||
|
- (void) test {
|
|||
|
if (y.x == 1) {
|
|||
|
int *p = 0;
|
|||
|
*p = 0xDEADBEEF; // expected-warning {{deference}}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// The original source for the above Radar contains another problem:
|
|||
|
// if the end-of-path node is an implicit statement, it may not have a valid
|
|||
|
// source location. <rdar://problem/12446776>
|
|||
|
- (void)test2 {
|
|||
|
if (bar_cond_assign()) {
|
|||
|
id foo = [[RDar10797980 alloc] init]; // leak
|
|||
|
}
|
|||
|
(void)y; // first statement after the 'if' is an implicit 'self' DeclRefExpr
|
|||
|
}
|
|||
|
|
|||
|
@end
|
|||
|
|
|||
|
// Test that loops are documented in the path.
|
|||
|
void rdar12280665() {
|
|||
|
for (unsigned i = 0; i < 2; ++i) {
|
|||
|
if (i == 1) {
|
|||
|
int *p = 0;
|
|||
|
*p = 0xDEADBEEF; // expected-warning {{dereference}}
|
|||
|
}
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
// Test for a "loop executed 0 times" diagnostic.
|
|||
|
int *radar12322528_bar();
|
|||
|
|
|||
|
void radar12322528_for(int x) {
|
|||
|
int *p = 0;
|
|||
|
for (unsigned i = 0; i < x; ++i) {
|
|||
|
p = radar12322528_bar();
|
|||
|
}
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
void radar12322528_while(int x) {
|
|||
|
int *p = 0;
|
|||
|
unsigned i = 0;
|
|||
|
for ( ; i < x ; ) {
|
|||
|
++i;
|
|||
|
p = radar12322528_bar();
|
|||
|
}
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
void radar12322528_foo_2() {
|
|||
|
int *p = 0;
|
|||
|
for (unsigned i = 0; i < 2; ++i) {
|
|||
|
if (i == 1)
|
|||
|
break;
|
|||
|
}
|
|||
|
*p = 0xDEADBEEF;
|
|||
|
}
|
|||
|
|
|||
|
void test_loop_diagnostics() {
|
|||
|
int *p = 0;
|
|||
|
for (int i = 0; i < 2; ++i) { p = 0; }
|
|||
|
*p = 1;
|
|||
|
}
|
|||
|
|
|||
|
void test_loop_diagnostics_2() {
|
|||
|
int *p = 0;
|
|||
|
for (int i = 0; i < 2; ) {
|
|||
|
++i;
|
|||
|
p = 0;
|
|||
|
}
|
|||
|
*p = 1;
|
|||
|
}
|
|||
|
|
|||
|
void test_loop_diagnostics_3() {
|
|||
|
int *p = 0;
|
|||
|
int i = 0;
|
|||
|
while (i < 2) {
|
|||
|
++i;
|
|||
|
p = 0;
|
|||
|
}
|
|||
|
*p = 1;
|
|||
|
}
|
|||
|
|
|||
|
void test_loop_fast_enumeration(id arr) {
|
|||
|
int x;
|
|||
|
for (id obj in arr) {
|
|||
|
x = 1;
|
|||
|
}
|
|||
|
x += 1;
|
|||
|
}
|
|||
|
|
|||
|
@interface RDar12114812 { char *p; }
|
|||
|
@end
|
|||
|
|
|||
|
@implementation RDar12114812
|
|||
|
- (void)test {
|
|||
|
p = 0;
|
|||
|
*p = 1;
|
|||
|
}
|
|||
|
@end
|
|||
|
|
|||
|
// Test diagnostics for initialization of structs.
|
|||
|
void RDar13295437_f(void *i) __attribute__((__nonnull__));
|
|||
|
|
|||
|
struct RDar13295437_S { int *i; };
|
|||
|
|
|||
|
int RDar13295437() {
|
|||
|
struct RDar13295437_S s = {0};
|
|||
|
struct RDar13295437_S *sp = &s;
|
|||
|
RDar13295437_f(sp->i);
|
|||
|
}
|
|||
|
|
|||
|
@interface Foo
|
|||
|
- (int *) returnsPointer;
|
|||
|
@end
|
|||
|
|
|||
|
int testFoo(Foo *x) {
|
|||
|
if (x)
|
|||
|
return 1;
|
|||
|
return *[x returnsPointer];
|
|||
|
}
|
|||
|
|