diff options
Diffstat (limited to 'test/Analysis')
47 files changed, 2245 insertions, 59 deletions
diff --git a/test/Analysis/Malloc+MismatchedDeallocator+NewDelete.cpp b/test/Analysis/Malloc+MismatchedDeallocator+NewDelete.cpp index fca02aa..6fab8bb 100644 --- a/test/Analysis/Malloc+MismatchedDeallocator+NewDelete.cpp +++ b/test/Analysis/Malloc+MismatchedDeallocator+NewDelete.cpp @@ -97,9 +97,11 @@ void testShouldReportDoubleFreeNotMismatched() { free(p); delete globalPtr; // expected-warning {{Attempt to free released memory}} } - +int *allocIntArray(unsigned c) { + return new int[c]; +} void testMismatchedChangePointeeThroughAssignment() { - int *arr = new int[4]; + int *arr = allocIntArray(4); globalPtr = arr; delete arr; // expected-warning{{Memory allocated by 'new[]' should be deallocated by 'delete[]', not 'delete'}} -}
\ No newline at end of file +} diff --git a/test/Analysis/Malloc+MismatchedDeallocator_intersections.cpp b/test/Analysis/Malloc+MismatchedDeallocator_intersections.cpp index 639790d..bca223b 100644 --- a/test/Analysis/Malloc+MismatchedDeallocator_intersections.cpp +++ b/test/Analysis/Malloc+MismatchedDeallocator_intersections.cpp @@ -24,5 +24,16 @@ void testNewDeleteNoWarn() { int *p4 = new int; delete p4; - int j = *p4; // no-warning + int j = *p4; // no-warning +} + +void testUseZeroAllocNoWarn() { + int *p1 = (int *)operator new(0); + *p1 = 1; // no-warning + + int *p2 = (int *)operator new[](0); + p2[0] = 1; // no-warning + + int *p3 = new int[0]; + p3[0] = 1; // no-warning } diff --git a/test/Analysis/MismatchedDeallocator-checker-test.mm b/test/Analysis/MismatchedDeallocator-checker-test.mm index 0df5db5..3cc3e18 100644 --- a/test/Analysis/MismatchedDeallocator-checker-test.mm +++ b/test/Analysis/MismatchedDeallocator-checker-test.mm @@ -59,6 +59,11 @@ void testMalloc8() { operator delete[](p); // expected-warning{{Memory allocated by malloc() should be deallocated by free(), not operator delete[]}} } +void testAlloca() { + int *p = (int *)__builtin_alloca(sizeof(int)); + delete p; // expected-warning{{Memory allocated by alloca() should not be deallocated}} +} + //--------------- test new family void testNew1() { int *p = new int; @@ -90,8 +95,11 @@ void testNew6() { realloc(p, sizeof(long)); // expected-warning{{Memory allocated by 'new[]' should be deallocated by 'delete[]', not realloc()}} } +int *allocInt() { + return new int; +} void testNew7() { - int *p = new int; + int *p = allocInt(); delete[] p; // expected-warning{{Memory allocated by 'new' should be deallocated by 'delete', not 'delete[]'}} } @@ -100,8 +108,12 @@ void testNew8() { delete[] p; // expected-warning{{Memory allocated by operator new should be deallocated by 'delete', not 'delete[]'}} } +int *allocIntArray(unsigned c) { + return new int[c]; +} + void testNew9() { - int *p = new int[1]; + int *p = allocIntArray(1); delete p; // expected-warning{{Memory allocated by 'new[]' should be deallocated by 'delete[]', not 'delete'}} } diff --git a/test/Analysis/MismatchedDeallocator-path-notes.cpp b/test/Analysis/MismatchedDeallocator-path-notes.cpp index 61ab4f1..af24197 100644 --- a/test/Analysis/MismatchedDeallocator-path-notes.cpp +++ b/test/Analysis/MismatchedDeallocator-path-notes.cpp @@ -3,9 +3,12 @@ // RUN: FileCheck --input-file=%t.plist %s void changePointee(int *p); +int *allocIntArray(unsigned c) { + return new int[c]; // expected-note {{Memory is allocated}} +} void test() { - int *p = new int[1]; - // expected-note@-1 {{Memory is allocated}} + int *p = allocIntArray(1); // expected-note {{Calling 'allocIntArray'}} + // expected-note@-1 {{Returned allocated memory}} changePointee(p); delete p; // expected-warning {{Memory allocated by 'new[]' should be deallocated by 'delete[]', not 'delete'}} // expected-note@-1 {{Memory allocated by 'new[]' should be deallocated by 'delete[]', not 'delete'}} @@ -24,13 +27,124 @@ void test() { // CHECK-NEXT: <key>start</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>3</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>5</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>end</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>24</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>event</string> +// CHECK-NEXT: <key>location</key> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <key>ranges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>27</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>depth</key><integer>0</integer> +// CHECK-NEXT: <key>extended_message</key> +// CHECK-NEXT: <string>Calling 'allocIntArray'</string> +// CHECK-NEXT: <key>message</key> +// CHECK-NEXT: <string>Calling 'allocIntArray'</string> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>event</string> +// CHECK-NEXT: <key>location</key> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>6</integer> +// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <key>depth</key><integer>1</integer> +// CHECK-NEXT: <key>extended_message</key> +// CHECK-NEXT: <string>Entered call from 'test'</string> +// CHECK-NEXT: <key>message</key> +// CHECK-NEXT: <string>Entered call from 'test'</string> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>control</string> +// CHECK-NEXT: <key>edges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>start</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>6</integer> +// CHECK-NEXT: <key>col</key><integer>1</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>6</integer> +// CHECK-NEXT: <key>col</key><integer>3</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>end</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>7</integer> // CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>7</integer> -// CHECK-NEXT: <key>col</key><integer>5</integer> +// CHECK-NEXT: <key>col</key><integer>8</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>control</string> +// CHECK-NEXT: <key>edges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>start</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>7</integer> +// CHECK-NEXT: <key>col</key><integer>3</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>7</integer> +// CHECK-NEXT: <key>col</key><integer>8</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -38,12 +152,12 @@ void test() { // CHECK-NEXT: <array> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>7</integer> -// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>col</key><integer>10</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>7</integer> -// CHECK-NEXT: <key>col</key><integer>14</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -55,7 +169,7 @@ void test() { // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>7</integer> -// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>col</key><integer>10</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <key>ranges</key> @@ -63,23 +177,52 @@ void test() { // CHECK-NEXT: <array> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>7</integer> -// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>col</key><integer>10</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>7</integer> -// CHECK-NEXT: <key>col</key><integer>21</integer> +// CHECK-NEXT: <key>col</key><integer>19</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: </array> -// CHECK-NEXT: <key>depth</key><integer>0</integer> +// CHECK-NEXT: <key>depth</key><integer>1</integer> // CHECK-NEXT: <key>extended_message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: <key>message</key> // CHECK-NEXT: <string>Memory is allocated</string> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> +// CHECK-NEXT: <key>kind</key><string>event</string> +// CHECK-NEXT: <key>location</key> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <key>ranges</key> +// CHECK-NEXT: <array> +// CHECK-NEXT: <array> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>27</integer> +// CHECK-NEXT: <key>file</key><integer>0</integer> +// CHECK-NEXT: </dict> +// CHECK-NEXT: </array> +// CHECK-NEXT: </array> +// CHECK-NEXT: <key>depth</key><integer>0</integer> +// CHECK-NEXT: <key>extended_message</key> +// CHECK-NEXT: <string>Returned allocated memory</string> +// CHECK-NEXT: <key>message</key> +// CHECK-NEXT: <string>Returned allocated memory</string> +// CHECK-NEXT: </dict> +// CHECK-NEXT: <dict> // CHECK-NEXT: <key>kind</key><string>control</string> // CHECK-NEXT: <key>edges</key> // CHECK-NEXT: <array> @@ -87,25 +230,25 @@ void test() { // CHECK-NEXT: <key>start</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>7</integer> +// CHECK-NEXT: <key>line</key><integer>10</integer> // CHECK-NEXT: <key>col</key><integer>12</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>7</integer> -// CHECK-NEXT: <key>col</key><integer>14</integer> +// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>col</key><integer>24</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> // CHECK-NEXT: <key>end</key> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>line</key><integer>13</integer> // CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>line</key><integer>13</integer> // CHECK-NEXT: <key>col</key><integer>8</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> @@ -117,7 +260,7 @@ void test() { // CHECK-NEXT: <key>kind</key><string>event</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>line</key><integer>13</integer> // CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> @@ -125,12 +268,12 @@ void test() { // CHECK-NEXT: <array> // CHECK-NEXT: <array> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>line</key><integer>13</integer> // CHECK-NEXT: <key>col</key><integer>10</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>line</key><integer>13</integer> // CHECK-NEXT: <key>col</key><integer>10</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> @@ -146,12 +289,13 @@ void test() { // CHECK-NEXT: <key>description</key><string>Memory allocated by 'new[]' should be deallocated by 'delete[]', not 'delete'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Bad deallocator</string> +// CHECK-NEXT: <key>check_name</key><string>unix.MismatchedDeallocator</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> -// CHECK-NEXT: <key>line</key><integer>10</integer> +// CHECK-NEXT: <key>line</key><integer>13</integer> // CHECK-NEXT: <key>col</key><integer>3</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> diff --git a/test/Analysis/NewDelete-checker-test.cpp b/test/Analysis/NewDelete-checker-test.cpp index 84176c9..443cb2e 100644 --- a/test/Analysis/NewDelete-checker-test.cpp +++ b/test/Analysis/NewDelete-checker-test.cpp @@ -87,6 +87,30 @@ void testNewInvalidationPlacement(PtrWrapper *w) { new (w) PtrWrapper(new int); // no warn } +//----------------------------------------- +// check for usage of zero-allocated memory +//----------------------------------------- + +void testUseZeroAlloc1() { + int *p = (int *)operator new(0); + *p = 1; // expected-warning {{Use of zero-allocated memory}} + delete p; +} + +int testUseZeroAlloc2() { + int *p = (int *)operator new[](0); + return p[0]; // expected-warning {{Use of zero-allocated memory}} + delete[] p; +} + +void f(int); + +void testUseZeroAlloc3() { + int *p = new int[0]; + f(*p); // expected-warning {{Use of zero-allocated memory}} + delete[] p; +} + //--------------- // other checks //--------------- @@ -144,11 +168,6 @@ void testUseThisAfterDelete() { c->f(0); // expected-warning{{Use of memory after it is freed}} } -void testDeleteAlloca() { - int *p = (int *)__builtin_alloca(sizeof(int)); - delete p; // expected-warning{{Memory allocated by alloca() should not be deallocated}} -} - void testDoubleDelete() { int *p = new int; delete p; diff --git a/test/Analysis/NewDelete-intersections.mm b/test/Analysis/NewDelete-intersections.mm index 886df12..cde8122 100644 --- a/test/Analysis/NewDelete-intersections.mm +++ b/test/Analysis/NewDelete-intersections.mm @@ -5,6 +5,7 @@ typedef __typeof__(sizeof(int)) size_t; extern "C" void *malloc(size_t); +extern "C" void *alloca(size_t); extern "C" void free(void *); //---------------------------------------------------------------------------- @@ -29,13 +30,24 @@ void testMallocFreeNoWarn() { int *p4 = (int *)malloc(sizeof(int)); free(p4); int j = *p4; // no warn + + int *p5 = (int *)alloca(sizeof(int)); + free(p5); // no warn } void testDeleteMalloced() { - int *p = (int *)malloc(sizeof(int)); - delete p; // no warn + int *p1 = (int *)malloc(sizeof(int)); + delete p1; // no warn + + int *p2 = (int *)__builtin_alloca(sizeof(int)); + delete p2; // no warn } +void testUseZeroAllocatedMalloced() { + int *p1 = (int *)malloc(0); + *p1 = 1; // no warn +} + //----- Test free standard new void testFreeOpNew() { void *p = operator new(0); diff --git a/test/Analysis/NewDelete-path-notes.cpp b/test/Analysis/NewDelete-path-notes.cpp index b420551..f55df00 100644 --- a/test/Analysis/NewDelete-path-notes.cpp +++ b/test/Analysis/NewDelete-path-notes.cpp @@ -259,6 +259,7 @@ void test(Odd *odd) { // CHECK-NEXT: <key>description</key><string>Attempt to free released memory</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Double free</string> +// CHECK-NEXT: <key>check_name</key><string>cplusplus.NewDelete</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -474,6 +475,7 @@ void test(Odd *odd) { // CHECK-NEXT: <key>description</key><string>Attempt to free released memory</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Double free</string> +// CHECK-NEXT: <key>check_name</key><string>cplusplus.NewDelete</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> diff --git a/test/Analysis/array-struct.c b/test/Analysis/array-struct.c index c22f979..28e09ad 100644 --- a/test/Analysis/array-struct.c +++ b/test/Analysis/array-struct.c @@ -183,3 +183,19 @@ int offset_of_data_array(void) return ((char *)&(((struct s*)0)->data_array)) - ((char *)0); // no-warning } +int testPointerArithmeticOnVoid(void *bytes) { + int p = 0; + if (&bytes[0] == &bytes[1]) + return 6/p; // no-warning + return 0; +} + +int testRValueArraySubscriptExpr(void *bytes) { + int *p = (int*)&bytes[0]; + *p = 0; + if (*(int*)&bytes[0] == 0) + return 0; + return 5/(*p); // no-warning +} + + diff --git a/test/Analysis/conditional-path-notes.c b/test/Analysis/conditional-path-notes.c index 2378497..9583a4e 100644 --- a/test/Analysis/conditional-path-notes.c +++ b/test/Analysis/conditional-path-notes.c @@ -313,6 +313,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'x')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testCondOp</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -456,6 +457,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testCondProblem</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -599,6 +601,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testLHSProblem</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -742,6 +745,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testRHSProblem</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -953,6 +957,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'x')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testBinaryCondOp</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1096,6 +1101,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testBinaryLHSProblem</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -1273,6 +1279,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testDiagnosableBranch</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1455,6 +1462,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testNonDiagnosableBranchLogical</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1569,6 +1577,7 @@ void testNonDiagnosableBranchArithmetic(int a, int b) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testNonDiagnosableBranchArithmetic</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> diff --git a/test/Analysis/crash-trace.c b/test/Analysis/crash-trace.c index a2f318d..bac7447 100644 --- a/test/Analysis/crash-trace.c +++ b/test/Analysis/crash-trace.c @@ -1,6 +1,10 @@ // RUN: not --crash %clang_cc1 -analyze -analyzer-checker=debug.ExprInspection %s 2>&1 | FileCheck %s // REQUIRES: crash-recovery +// FIXME: CHECKs might be incompatible to win32. +// Stack traces also require back traces. +// REQUIRES: shell, backtrace + void clang_analyzer_crash(void); void inlined() { diff --git a/test/Analysis/cxx-for-range.cpp b/test/Analysis/cxx-for-range.cpp index fe73e51..6278ba5 100644 --- a/test/Analysis/cxx-for-range.cpp +++ b/test/Analysis/cxx-for-range.cpp @@ -596,6 +596,7 @@ void testLoopErrorInRange() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testLoop</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -821,6 +822,7 @@ void testLoopErrorInRange() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>get</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1095,6 +1097,7 @@ void testLoopErrorInRange() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testLoopOpaqueCollection</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -1238,6 +1241,7 @@ void testLoopErrorInRange() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testLoopOpaqueCollection</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> @@ -1512,6 +1516,7 @@ void testLoopErrorInRange() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testLoopOpaqueIterator</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -1655,6 +1660,7 @@ void testLoopErrorInRange() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testLoopOpaqueIterator</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> diff --git a/test/Analysis/diagnostics/deref-track-symbolic-region.c b/test/Analysis/diagnostics/deref-track-symbolic-region.c index 36d56f1..47d4c60 100644 --- a/test/Analysis/diagnostics/deref-track-symbolic-region.c +++ b/test/Analysis/diagnostics/deref-track-symbolic-region.c @@ -305,6 +305,7 @@ void testTrackConstraintBRVisitorIsTrackingTurnedOn(struct S syz, int *pp) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'x')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> @@ -642,6 +643,7 @@ void testTrackConstraintBRVisitorIsTrackingTurnedOn(struct S syz, int *pp) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testTrackConstraintBRVisitorIsTrackingTurnedOn</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> diff --git a/test/Analysis/diagnostics/report-issues-within-main-file.cpp b/test/Analysis/diagnostics/report-issues-within-main-file.cpp index ec8106f..e10c706 100644 --- a/test/Analysis/diagnostics/report-issues-within-main-file.cpp +++ b/test/Analysis/diagnostics/report-issues-within-main-file.cpp @@ -248,6 +248,7 @@ void callInMacroArg() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>cause_div_by_zero_in_header2</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -511,6 +512,7 @@ void callInMacroArg() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>cause_div_by_zero_in_header3</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -542,7 +544,7 @@ void callInMacroArg() { // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>69</integer> -// CHECK-NEXT: <key>col</key><integer>18</integer> +// CHECK-NEXT: <key>col</key><integer>51</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -697,6 +699,7 @@ void callInMacroArg() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>cause_div_by_zero_in_header4</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -937,6 +940,7 @@ void callInMacroArg() { // CHECK-NEXT: <key>description</key><string>Memory allocated by 'new[]' should be deallocated by 'delete[]', not 'delete' (within a call to '~auto_ptr')</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Bad deallocator</string> +// CHECK-NEXT: <key>check_name</key><string>unix.MismatchedDeallocator</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>mainPlusHeader</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1269,6 +1273,7 @@ void callInMacroArg() { // CHECK-NEXT: <key>description</key><string>Division by zero (within a call to 'cause_div_by_zero_in_header')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>auxInMain</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1489,6 +1494,7 @@ void callInMacroArg() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>causeDivByZeroInMain</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1743,6 +1749,7 @@ void callInMacroArg() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>causeDivByZeroInMain2</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> diff --git a/test/Analysis/diagnostics/undef-value-caller.c b/test/Analysis/diagnostics/undef-value-caller.c index da3a13c..c811017 100644 --- a/test/Analysis/diagnostics/undef-value-caller.c +++ b/test/Analysis/diagnostics/undef-value-caller.c @@ -146,6 +146,7 @@ int test_calling_unimportant_callee(int argc, char *argv[]) { // CHECK-NEXT: <key>description</key><string>Undefined or garbage value returned to caller</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Garbage return value</string> +// CHECK-NEXT: <key>check_name</key><string>core.uninitialized.UndefReturn</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_calling_unimportant_callee</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> diff --git a/test/Analysis/diagnostics/undef-value-param.c b/test/Analysis/diagnostics/undef-value-param.c index dec0a5a..f418b19 100644 --- a/test/Analysis/diagnostics/undef-value-param.c +++ b/test/Analysis/diagnostics/undef-value-param.c @@ -435,6 +435,7 @@ double testPassingParentRegionStruct(int x) { // CHECK-NEXT: <key>description</key><string>The left operand of '+' is a garbage value</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Result of operation is garbage or undefined</string> +// CHECK-NEXT: <key>check_name</key><string>core.UndefinedBinaryOperatorResult</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>use</string> // CHECK-NEXT: <key>issue_hash</key><string>7</string> @@ -752,6 +753,7 @@ double testPassingParentRegionStruct(int x) { // CHECK-NEXT: <key>description</key><string>The right operand of '*' is a garbage value</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Result of operation is garbage or undefined</string> +// CHECK-NEXT: <key>check_name</key><string>core.UndefinedBinaryOperatorResult</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testPassingParentRegionArray</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1166,6 +1168,7 @@ double testPassingParentRegionStruct(int x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'f1')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testPassingParentRegionStruct</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> diff --git a/test/Analysis/diagnostics/undef-value-param.m b/test/Analysis/diagnostics/undef-value-param.m index b0ce56c..5ca08a5 100644 --- a/test/Analysis/diagnostics/undef-value-param.m +++ b/test/Analysis/diagnostics/undef-value-param.m @@ -543,6 +543,7 @@ static void CreateRefUndef(SCDynamicStoreRef *storeRef, unsigned x) { // CHECK-NEXT: <key>description</key><string>Null pointer argument in call to CFRelease</string> // CHECK-NEXT: <key>category</key><string>API Misuse (Apple)</string> // CHECK-NEXT: <key>type</key><string>null passed to CF memory management function</string> +// CHECK-NEXT: <key>check_name</key><string>osx.coreFoundation.CFRetainRelease</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -923,6 +924,7 @@ static void CreateRefUndef(SCDynamicStoreRef *storeRef, unsigned x) { // CHECK-NEXT: <key>description</key><string>Function call argument is an uninitialized value</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Uninitialized argument value</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test2</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> diff --git a/test/Analysis/dtor.cpp b/test/Analysis/dtor.cpp index 8d6e30a..bb1e625 100644 --- a/test/Analysis/dtor.cpp +++ b/test/Analysis/dtor.cpp @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors,cfg-temporary-dtors=true -Wno-null-dereference -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix.Malloc,debug.ExprInspection -analyzer-config c++-inlining=destructors,cfg-temporary-dtors=true -Wno-null-dereference -Wno-inaccessible-base -verify %s void clang_analyzer_eval(bool); void clang_analyzer_checkInlined(bool); diff --git a/test/Analysis/edges-new.mm b/test/Analysis/edges-new.mm index 8019c15..2c39dfd 100644 --- a/test/Analysis/edges-new.mm +++ b/test/Analysis/edges-new.mm @@ -725,6 +725,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_init</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -902,6 +903,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_assign</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1142,6 +1144,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'q')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_assign_transitive</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1319,6 +1322,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_cond</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1559,6 +1563,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_cond_transitive</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1736,6 +1741,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_field</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -2073,6 +2079,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_assumptions</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -2342,6 +2349,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_cond_assign</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -2601,6 +2609,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'value'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>rdar8331641</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -2778,6 +2787,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_objc_fast_enumeration</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -2824,6 +2834,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Value stored to 'x' is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead increment</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_objc_fast_enumeration_2</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -3030,6 +3041,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Assigned value is garbage or undefined</string> +// CHECK-NEXT: <key>check_name</key><string>core.uninitialized.Assign</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_objc_fast_enumeration_2</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -3464,6 +3476,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>rdar12280665</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -3767,6 +3780,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>radar12322528_for</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -4036,6 +4050,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>radar12322528_while</string> // CHECK-NEXT: <key>issue_hash</key><string>7</string> @@ -4538,6 +4553,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>radar12322528_foo_2</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> @@ -5035,6 +5051,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_diagnostics</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -5600,6 +5617,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_diagnostics_2</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> @@ -6165,6 +6183,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_diagnostics_3</string> // CHECK-NEXT: <key>issue_hash</key><string>10</string> @@ -6609,6 +6628,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_do_while</string> // CHECK-NEXT: <key>issue_hash</key><string>12</string> @@ -6854,6 +6874,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_logical_and</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -7099,6 +7120,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_logical_or</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -7378,6 +7400,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_logical_or_call</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -7657,6 +7680,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_nested_logicals</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -8072,6 +8096,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_nested_logicals</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -8555,6 +8580,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_deeply_nested_logicals</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -8965,6 +8991,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_ternary</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -9239,6 +9266,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testUseless</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -9445,6 +9473,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testFoo</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -9617,6 +9646,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test1_IPA_X</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -10012,6 +10042,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_IPA_Y</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -10232,6 +10263,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>causeDivByZeroInMain</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -10375,6 +10407,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from ivar 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -10484,6 +10517,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Null pointer passed as an argument to a 'nonnull' parameter</string> // CHECK-NEXT: <key>category</key><string>API</string> // CHECK-NEXT: <key>type</key><string>Argument with 'nonnull' attribute passed null</string> +// CHECK-NEXT: <key>check_name</key><string>core.NonNullParamChecker</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>RDar13295437</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -10695,6 +10729,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testCast</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -10872,6 +10907,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -10930,6 +10966,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Value stored to 'foo' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test2</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -11058,6 +11095,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'foo'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test2</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -11235,6 +11273,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> @@ -11679,6 +11718,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>20</string> @@ -12089,6 +12129,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>26</string> @@ -12562,6 +12603,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>34</string> @@ -13816,6 +13858,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>62</string> @@ -15133,6 +15176,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>67</string> @@ -16547,6 +16591,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>74</string> @@ -18058,6 +18103,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>variousLoops</string> // CHECK-NEXT: <key>issue_hash</key><string>83</string> @@ -18341,6 +18387,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>reallocDiagnostics</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -18580,6 +18627,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Memory allocated by 'new[]' should be deallocated by 'delete[]', not 'delete'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Bad deallocator</string> +// CHECK-NEXT: <key>check_name</key><string>unix.MismatchedDeallocator</string> // CHECK-NEXT: <key>issue_hash</key><string>0</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> @@ -19292,6 +19340,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'foo'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>longLines</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -19435,6 +19484,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testMacroInFunctionDecl</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -19617,6 +19667,7 @@ namespace rdar14960554 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> diff --git a/test/Analysis/free.c b/test/Analysis/free.c index 1dfc108..3746bf1 100644 --- a/test/Analysis/free.c +++ b/test/Analysis/free.c @@ -1,6 +1,8 @@ // RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-checker=core,unix.Malloc -fblocks -verify %s -// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-checker=core,alpha.unix.MallocWithAnnotations -fblocks -verify %s +// RUN: %clang_cc1 -analyze -analyzer-store=region -analyzer-checker=core,unix.Malloc -fblocks -verify -analyzer-config unix.Malloc:Optimistic=true %s +typedef __typeof(sizeof(int)) size_t; void free(void *); +void *alloca(size_t); void t1 () { int a[] = { 1 }; @@ -49,24 +51,29 @@ void t10 () { } void t11 () { - char *p = (char*)__builtin_alloca(2); + char *p = (char*)alloca(2); free(p); // expected-warning {{Memory allocated by alloca() should not be deallocated}} } void t12 () { + char *p = (char*)__builtin_alloca(2); + free(p); // expected-warning {{Memory allocated by alloca() should not be deallocated}} +} + +void t13 () { free(^{return;}); // expected-warning {{Argument to free() is a block, which is not memory allocated by malloc()}} } -void t13 (char a) { +void t14 (char a) { free(&a); // expected-warning {{Argument to free() is the address of the parameter 'a', which is not memory allocated by malloc()}} } static int someGlobal[2]; -void t14 () { +void t15 () { free(someGlobal); // expected-warning {{Argument to free() is the address of the global variable 'someGlobal', which is not memory allocated by malloc()}} } -void t15 (char **x, int offset) { +void t16 (char **x, int offset) { // Unknown value free(x[offset]); // no-warning } diff --git a/test/Analysis/html-diags.c b/test/Analysis/html-diags.c index 1b01783..e998020 100644 --- a/test/Analysis/html-diags.c +++ b/test/Analysis/html-diags.c @@ -8,8 +8,6 @@ // RUN: %clang_cc1 -analyze -analyzer-output=html -analyzer-checker=core -o testrelative %s // RUN: ls %T/dir/testrelative | grep report -// REQUIRES: shell - // Currently this test mainly checks that the HTML diagnostics doesn't crash // when handling macros will calls with macros. We should actually validate // the output, but that requires being able to match against a specifically diff --git a/test/Analysis/inline-plist.c b/test/Analysis/inline-plist.c index bcf15b3..8558e8f 100644 --- a/test/Analysis/inline-plist.c +++ b/test/Analysis/inline-plist.c @@ -289,6 +289,7 @@ void test_block_arg() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>foo</string> // CHECK-NEXT: <key>issue_hash</key><string>7</string> @@ -509,6 +510,7 @@ void test_block_arg() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>has_bug</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -860,6 +862,7 @@ void test_block_arg() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>triggers_bug</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1080,6 +1083,7 @@ void test_block_arg() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>60</integer> @@ -1452,6 +1456,7 @@ void test_block_arg() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_block_ret</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -1701,6 +1706,7 @@ void test_block_arg() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_block_blockvar</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -1950,6 +1956,7 @@ void test_block_arg() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_block_arg</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> diff --git a/test/Analysis/inline-unique-reports.c b/test/Analysis/inline-unique-reports.c index 9f33bd4..89cff09 100644 --- a/test/Analysis/inline-unique-reports.c +++ b/test/Analysis/inline-unique-reports.c @@ -291,6 +291,7 @@ void test_bug_2() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>bug</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> diff --git a/test/Analysis/inlining/eager-reclamation-path-notes.c b/test/Analysis/inlining/eager-reclamation-path-notes.c index d14aba3..f57a3bb 100644 --- a/test/Analysis/inlining/eager-reclamation-path-notes.c +++ b/test/Analysis/inlining/eager-reclamation-path-notes.c @@ -318,6 +318,7 @@ void testChainedCalls() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'ptr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>use</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -775,6 +776,7 @@ void testChainedCalls() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'ptr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>use2</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> diff --git a/test/Analysis/inlining/eager-reclamation-path-notes.cpp b/test/Analysis/inlining/eager-reclamation-path-notes.cpp index 672b3b8..b02e796 100644 --- a/test/Analysis/inlining/eager-reclamation-path-notes.cpp +++ b/test/Analysis/inlining/eager-reclamation-path-notes.cpp @@ -372,6 +372,7 @@ int memberCallBaseDisappears() { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is null</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is null</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>memberCallBaseDisappears</string> // CHECK-NEXT: <key>issue_hash</key><string>19</string> diff --git a/test/Analysis/inlining/path-notes.c b/test/Analysis/inlining/path-notes.c index deb2efe..9b625c8 100644 --- a/test/Analysis/inlining/path-notes.c +++ b/test/Analysis/inlining/path-notes.c @@ -347,6 +347,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testZero</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -524,6 +525,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testCheck</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -764,6 +766,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testInitCheck</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -1004,6 +1007,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testStoreCheck</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -1316,6 +1320,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testReturnZero</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1628,6 +1633,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testReturnZero2</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -2003,6 +2009,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testInitZero</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -2378,6 +2385,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testStoreZero</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -2796,6 +2804,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>usePointer</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3045,6 +3054,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testSetFieldToNull</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -3154,6 +3164,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -3331,6 +3342,7 @@ void test4(int **p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test4</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> diff --git a/test/Analysis/inlining/path-notes.cpp b/test/Analysis/inlining/path-notes.cpp index 1e23074..3072511 100644 --- a/test/Analysis/inlining/path-notes.cpp +++ b/test/Analysis/inlining/path-notes.cpp @@ -877,6 +877,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>C++ method</string> // CHECK-NEXT: <key>issue_context</key><string>use</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1165,6 +1166,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>C++ method</string> // CHECK-NEXT: <key>issue_context</key><string>method</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1414,6 +1416,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'globalPtr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> @@ -1661,6 +1664,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'globalPtr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> @@ -1942,6 +1946,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'globalPtr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> @@ -2257,6 +2262,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'globalPtr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>C++ method</string> // CHECK-NEXT: <key>issue_context</key><string>operator=</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -2452,12 +2458,12 @@ namespace PR17746 { // CHECK-NEXT: <array> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>105</integer> -// CHECK-NEXT: <key>col</key><integer>53</integer> +// CHECK-NEXT: <key>col</key><integer>63</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>105</integer> -// CHECK-NEXT: <key>col</key><integer>53</integer> +// CHECK-NEXT: <key>col</key><integer>63</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -2469,7 +2475,7 @@ namespace PR17746 { // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>105</integer> -// CHECK-NEXT: <key>col</key><integer>53</integer> +// CHECK-NEXT: <key>col</key><integer>63</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <key>ranges</key> @@ -2477,12 +2483,12 @@ namespace PR17746 { // CHECK-NEXT: <array> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>105</integer> -// CHECK-NEXT: <key>col</key><integer>53</integer> +// CHECK-NEXT: <key>col</key><integer>63</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>105</integer> -// CHECK-NEXT: <key>col</key><integer>53</integer> +// CHECK-NEXT: <key>col</key><integer>63</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -2608,6 +2614,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'globalPtr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>C++ method</string> // CHECK-NEXT: <key>issue_context</key><string>operator=</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -2895,6 +2902,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'globalPtr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> @@ -3142,6 +3150,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3488,6 +3497,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testRef</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3597,6 +3607,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Returning null reference</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Returning null reference</string> +// CHECK-NEXT: <key>check_name</key><string>core.uninitialized.UndefReturn</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>returnNullReference</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -3962,6 +3973,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'ptr')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> @@ -4166,6 +4178,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'y')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testNonPrintableAssignment</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -4275,6 +4288,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'x')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -4452,6 +4466,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>C++ method</string> // CHECK-NEXT: <key>issue_context</key><string>testGetDerefExprOnMemberExprWithADot</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -4561,6 +4576,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of undefined pointer value</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of undefined pointer value</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testGetDerefExprOnMemberExprWithADot</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -4767,6 +4783,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is null</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is null</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testDeclRefExprToReferenceInGetDerefExpr</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -4987,6 +5004,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>generateNoteOnDefaultArgument</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -5221,6 +5239,7 @@ namespace PR17746 { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> diff --git a/test/Analysis/inlining/path-notes.m b/test/Analysis/inlining/path-notes.m index 2304038..4a5d2ae 100644 --- a/test/Analysis/inlining/path-notes.m +++ b/test/Analysis/inlining/path-notes.m @@ -575,6 +575,7 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testReturnZeroIfNil</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -882,6 +883,7 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testDispatchSyncInlining</string> // CHECK-NEXT: <key>issue_hash</key><string>14</string> @@ -1131,6 +1133,7 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: <key>description</key><string>Variable 'x' is uninitialized when captured by block</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>uninitialized variable captured by block</string> +// CHECK-NEXT: <key>check_name</key><string>core.uninitialized.CapturedBlockVariable</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>118</integer> @@ -1445,6 +1448,7 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'x')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testNilReceiverHelper</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1622,6 +1626,7 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: <key>description</key><string>Array element cannot be nil</string> // CHECK-NEXT: <key>category</key><string>API Misuse (Apple)</string> // CHECK-NEXT: <key>type</key><string>nil argument</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.NilArg</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testCreateArrayLiteral</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -2017,6 +2022,7 @@ void testNullDereferenceInDispatch() { // CHECK-NEXT: <key>description</key><string>Object autoreleased too many times</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Object autoreleased too many times</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testAutoreleaseTakesEffectInDispatch</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> diff --git a/test/Analysis/malloc-annotations.c b/test/Analysis/malloc-annotations.c index c197df4..3119cb7 100644 --- a/test/Analysis/malloc-annotations.c +++ b/test/Analysis/malloc-annotations.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,alpha.unix.MallocWithAnnotations -analyzer-store=region -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.deadcode.UnreachableCode,alpha.core.CastSize,unix.Malloc -analyzer-store=region -verify -analyzer-config unix.Malloc:Optimistic=true %s typedef __typeof(sizeof(int)) size_t; void *malloc(size_t); void free(void *); diff --git a/test/Analysis/malloc-plist.c b/test/Analysis/malloc-plist.c index 0cbf972..4ac6cec 100644 --- a/test/Analysis/malloc-plist.c +++ b/test/Analysis/malloc-plist.c @@ -408,6 +408,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'p'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>diagnosticTest</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -570,6 +571,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'A'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>myArrayAllocation</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -955,6 +957,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>reallocDiagnostics</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1354,6 +1357,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_wrapper</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1874,6 +1878,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Use of memory after it is freed</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Use-after-free</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_double_action_call</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -2433,6 +2438,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'buf'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>reallocIntra</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -2701,6 +2707,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'v'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>use_ret</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -2863,6 +2870,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'm'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>LeakedSymbol</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -3068,6 +3076,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'x'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>function_with_leak1</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3273,6 +3282,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'x'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>function_with_leak2</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3575,6 +3585,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'x'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>function_with_leak3</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3877,6 +3888,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'x'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>function_with_leak4</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -4082,6 +4094,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'x'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>function_with_leak5</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -4287,6 +4300,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'x'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>function_with_leak6</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -4521,6 +4535,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential memory leak</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>use_function_with_leak7</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -4755,6 +4770,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential memory leak</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testOnlyRefferToVisibleVariables</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -5023,6 +5039,7 @@ void testMyMalloc() { // CHECK-NEXT: <key>description</key><string>Potential memory leak</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testMyMalloc</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> diff --git a/test/Analysis/malloc.c b/test/Analysis/malloc.c index 9c08bbc..662df4c2 100644 --- a/test/Analysis/malloc.c +++ b/test/Analysis/malloc.c @@ -6,6 +6,7 @@ void clang_analyzer_eval(int); typedef __typeof(sizeof(int)) size_t; void *malloc(size_t); +void *alloca(size_t); void *valloc(size_t); void free(void *); void *realloc(void *ptr, size_t size); @@ -50,6 +51,14 @@ void reallocNotNullPtr(unsigned sizeIn) { } } +void allocaTest() { + int *p = alloca(sizeof(int)); +} // no warn + +void allocaBuiltinTest() { + int *p = __builtin_alloca(sizeof(int)); +} // no warn + int *realloctest1() { int *q = malloc(12); q = realloc(q, 20); @@ -191,6 +200,112 @@ void reallocfPtrZero1() { char *r = reallocf(0, 12); } // expected-warning {{Potential leak of memory pointed to by}} +//------------------- Check usage of zero-allocated memory --------------------- +void CheckUseZeroAllocatedNoWarn1() { + int *p = malloc(0); + free(p); // no warning +} + +void CheckUseZeroAllocatedNoWarn2() { + int *p = alloca(0); // no warning +} + +void CheckUseZeroAllocatedNoWarn3() { + int *p = malloc(0); + int *q = realloc(p, 8); // no warning + free(q); +} + +void CheckUseZeroAllocatedNoWarn4() { + int *p = realloc(0, 8); + *p = 1; // no warning + free(p); +} + +void CheckUseZeroAllocated1() { + int *p = malloc(0); + *p = 1; // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +char CheckUseZeroAllocated2() { + char *p = alloca(0); + return *p; // expected-warning {{Use of zero-allocated memory}} +} + +void UseZeroAllocated(int *p) { + if (p) + *p = 7; // expected-warning {{Use of zero-allocated memory}} +} +void CheckUseZeroAllocated3() { + int *p = malloc(0); + UseZeroAllocated(p); +} + +void f(char); +void CheckUseZeroAllocated4() { + char *p = valloc(0); + f(*p); // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +void CheckUseZeroAllocated5() { + int *p = calloc(0, 2); + *p = 1; // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +void CheckUseZeroAllocated6() { + int *p = calloc(2, 0); + *p = 1; // expected-warning {{Use of zero-allocated memory}} + free(p); +} + +void CheckUseZeroAllocated7() { + int *p = realloc(0, 0); + *p = 1; //TODO: warn about use of zero-allocated memory + free(p); +} + +void CheckUseZeroAllocated8() { + int *p = malloc(8); + int *q = realloc(p, 0); + *q = 1; //TODO: warn about use of zero-allocated memory + free(q); +} + +void CheckUseZeroAllocated9() { + int *p = realloc(0, 0); + int *q = realloc(p, 0); + *q = 1; //TODO: warn about use of zero-allocated memory + free(q); +} + +void CheckUseZeroAllocatedPathNoWarn(_Bool b) { + int s = 0; + if (b) + s= 10; + + char *p = malloc(s); + + if (b) + *p = 1; // no warning + + free(p); +} + +void CheckUseZeroAllocatedPathWarn(_Bool b) { + int s = 10; + if (b) + s= 0; + + char *p = malloc(s); + + if (b) + *p = 1; // expected-warning {{Use of zero-allocated memory}} + + free(p); +} // This case tests that storing malloc'ed memory to a static variable which is // then returned is not leaked. In the absence of known contracts for functions diff --git a/test/Analysis/method-call-path-notes.cpp b/test/Analysis/method-call-path-notes.cpp index 20348d5..bb6964d 100644 --- a/test/Analysis/method-call-path-notes.cpp +++ b/test/Analysis/method-call-path-notes.cpp @@ -143,6 +143,7 @@ void test_cast(const TestInstanceCall *p) { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is uninitialized</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is uninitialized</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_ic</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -252,6 +253,7 @@ void test_cast(const TestInstanceCall *p) { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is null</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is null</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_ic_null</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -395,6 +397,7 @@ void test_cast(const TestInstanceCall *p) { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is null</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is null</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_ic_set_to_null</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -538,6 +541,7 @@ void test_cast(const TestInstanceCall *p) { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is null</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is null</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_ic_null</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -647,6 +651,7 @@ void test_cast(const TestInstanceCall *p) { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is null</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is null</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_ic_member_ptr</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -790,6 +795,7 @@ void test_cast(const TestInstanceCall *p) { // CHECK-NEXT: <key>description</key><string>Called C++ object pointer is null</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Called C++ object pointer is null</string> +// CHECK-NEXT: <key>check_name</key><string>core.CallAndMessage</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_cast</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> diff --git a/test/Analysis/model-file.cpp b/test/Analysis/model-file.cpp index 24d6e93..2ad84ea 100644 --- a/test/Analysis/model-file.cpp +++ b/test/Analysis/model-file.cpp @@ -275,6 +275,7 @@ int main() { // CHECK-NEXT: <key>description</key><string>Division by zero</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Division by zero</string> +// CHECK-NEXT: <key>check_name</key><string>core.DivideZero</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>main</string> // CHECK-NEXT: <key>issue_hash</key><string>15</string> diff --git a/test/Analysis/null-deref-path-notes.m b/test/Analysis/null-deref-path-notes.m index 6057694..da49eaa 100644 --- a/test/Analysis/null-deref-path-notes.m +++ b/test/Analysis/null-deref-path-notes.m @@ -283,6 +283,7 @@ void repeatedStores(int coin) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'x')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testNull</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -508,6 +509,7 @@ void repeatedStores(int coin) { // CHECK-NEXT: <key>description</key><string>Access to instance variable 'uniqueID' results in a dereference of a null pointer (loaded from variable 'self')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>initWithID:</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -782,6 +784,7 @@ void repeatedStores(int coin) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>repeatedStores</string> // CHECK-NEXT: <key>issue_hash</key><string>11</string> diff --git a/test/Analysis/objc-arc.m b/test/Analysis/objc-arc.m index 92432b1..e4a4e46 100644 --- a/test/Analysis/objc-arc.m +++ b/test/Analysis/objc-arc.m @@ -366,6 +366,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_working</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -528,6 +529,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'date'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_cf_leak</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -586,6 +588,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'x' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>rdar9424882</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -644,6 +647,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'obj1' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>from_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -702,6 +706,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'obj4' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>from_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -760,6 +765,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'obj5' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>from_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>7</string> @@ -818,6 +824,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'obj6' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>from_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -995,6 +1002,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'obj5'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>from_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>7</string> @@ -1123,6 +1131,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'obj6'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>from_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -1181,6 +1190,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'cf1' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>to_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1239,6 +1249,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'cf2' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>to_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1297,6 +1308,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'cf3' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>to_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1355,6 +1367,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Value stored to 'cf4' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>to_cf</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1498,6 +1511,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'date'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_objc_unretainedObject</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1796,6 +1810,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_objc_arrays</string> // CHECK-NEXT: <key>issue_hash</key><string>24</string> @@ -1965,6 +1980,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'o'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>rdar11059275_positive</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -2079,6 +2095,7 @@ id rdar14061675() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>rdar14061675</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> diff --git a/test/Analysis/objc-radar17039661.m b/test/Analysis/objc-radar17039661.m index ec4f19d..fc55ab1 100644 --- a/test/Analysis/objc-radar17039661.m +++ b/test/Analysis/objc-radar17039661.m @@ -1,5 +1,6 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -verify -fblocks %s - +// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -fblocks -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core,osx.cocoa.RetainCount -fblocks -analyzer-output=plist-multi-file -analyzer-config path-diagnostics-alternate=false %s -o %t +// RUN: FileCheck --input-file=%t %s @class NSString; typedef long NSInteger; typedef unsigned char BOOL; @@ -13,14 +14,13 @@ typedef unsigned char BOOL; @interface NSNumber : NSObject + (NSNumber *)numberWithInteger:(NSInteger)value __attribute__((availability(ios,introduced=2.0))); @end - NSInteger *inoutIntegerValueGlobal; NSInteger *inoutIntegerValueGlobal2; NSString *traitNameGlobal; static BOOL cond; static inline void reallyPerformAction(void (^integerHandler)(NSInteger *inoutIntegerValue, NSString *traitName)) { - integerHandler(inoutIntegerValueGlobal, traitNameGlobal); + integerHandler(inoutIntegerValueGlobal, traitNameGlobal); // expected-warning {{Potential leak of an object}} integerHandler(inoutIntegerValueGlobal2,traitNameGlobal); } @@ -47,7 +47,7 @@ static inline BOOL performAction(NSNumber *(^action)(NSNumber *traitValue)) { void runTest() { __attribute__((__blocks__(byref))) NSNumber *builtinResult = ((NSNumber *)0); BOOL wasBuiltinTrait = performAction(^(NSNumber *traitValue) { - builtinResult = [traitValue retain]; // expected-warning {{Potential leak of an object}} + builtinResult = [traitValue retain]; return traitValue; }); @@ -58,3 +58,1176 @@ void runTest() { return; } } + +// CHECK: <key>diagnostics</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>path</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>48</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>48</integer> +// CHECK: <key>col</key><integer>15</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>26</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>38</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>26</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>26</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>53</integer> +// CHECK: <key>col</key><integer>4</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>0</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Calling 'performAction'</string> +// CHECK: <key>message</key> +// CHECK: <string>Calling 'performAction'</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>1</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>depth</key><integer>1</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Entered call from 'runTest'</string> +// CHECK: <key>message</key> +// CHECK: <string>Entered call from 'runTest'</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>1</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>27</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>15</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>28</integer> +// CHECK: <key>col</key><integer>15</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>21</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>43</integer> +// CHECK: <key>col</key><integer>4</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>1</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Calling 'reallyPerformAction'</string> +// CHECK: <key>message</key> +// CHECK: <string>Calling 'reallyPerformAction'</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>1</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>depth</key><integer>2</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Entered call from 'performAction'</string> +// CHECK: <key>message</key> +// CHECK: <string>Entered call from 'performAction'</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>1</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>22</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>16</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>58</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>2</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: <key>message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>23</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Entered call from 'reallyPerformAction'</string> +// CHECK: <key>message</key> +// CHECK: <string>Entered call from 'reallyPerformAction'</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>23</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>23</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Assuming 'cond' is not equal to 0</string> +// CHECK: <key>message</key> +// CHECK: <string>Assuming 'cond' is not equal to 0</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>14</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>14</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>30</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>30</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>30</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>30</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>50</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>NSNumber boxed expression produces an object with a +0 retain count</string> +// CHECK: <key>message</key> +// CHECK: <string>NSNumber boxed expression produces an object with a +0 retain count</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>30</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>30</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>38</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>50</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: <key>message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>depth</key><integer>4</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Entered call</string> +// CHECK: <key>message</key> +// CHECK: <string>Entered call</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>17</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>17</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>21</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>21</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>21</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>21</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>39</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>22</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>31</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>4</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Reference count incremented. The object now has a +1 retain count</string> +// CHECK: <key>message</key> +// CHECK: <string>Reference count incremented. The object now has a +1 retain count</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>50</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Returning to caller</string> +// CHECK: <key>message</key> +// CHECK: <string>Returning to caller</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>38</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>37</integer> +// CHECK: <key>col</key><integer>8</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>40</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>40</integer> +// CHECK: <key>col</key><integer>18</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>58</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>2</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Returning to caller</string> +// CHECK: <key>message</key> +// CHECK: <string>Returning to caller</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>23</integer> +// CHECK: <key>col</key><integer>16</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>24</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>24</integer> +// CHECK: <key>col</key><integer>16</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>24</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>24</integer> +// CHECK: <key>col</key><integer>3</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>24</integer> +// CHECK: <key>col</key><integer>58</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>2</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: <key>message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>23</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Entered call from 'reallyPerformAction'</string> +// CHECK: <key>message</key> +// CHECK: <string>Entered call from 'reallyPerformAction'</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>23</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>29</integer> +// CHECK: <key>col</key><integer>23</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>6</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Assuming 'cond' is not equal to 0</string> +// CHECK: <key>message</key> +// CHECK: <string>Assuming 'cond' is not equal to 0</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>9</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>31</integer> +// CHECK: <key>col</key><integer>12</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>14</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>7</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>33</integer> +// CHECK: <key>col</key><integer>14</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>38</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>33</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>35</integer> +// CHECK: <key>col</key><integer>50</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>3</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: <key>message</key> +// CHECK: <string>Calling anonymous block</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>depth</key><integer>4</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Entered call</string> +// CHECK: <key>message</key> +// CHECK: <string>Entered call</string> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>49</integer> +// CHECK: <key>col</key><integer>40</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>17</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>control</string> +// CHECK: <key>edges</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>start</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>50</integer> +// CHECK: <key>col</key><integer>17</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>end</key> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>52</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>52</integer> +// CHECK: <key>col</key><integer>10</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>kind</key><string>event</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>52</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <key>ranges</key> +// CHECK: <array> +// CHECK: <array> +// CHECK: <dict> +// CHECK: <key>line</key><integer>52</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: <dict> +// CHECK: <key>line</key><integer>52</integer> +// CHECK: <key>col</key><integer>21</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </array> +// CHECK: </array> +// CHECK: <key>depth</key><integer>4</integer> +// CHECK: <key>extended_message</key> +// CHECK: <string>Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1</string> +// CHECK: <key>message</key> +// CHECK: <string>Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1</string> +// CHECK: </dict> +// CHECK: </array> +// CHECK: <key>description</key><string>Potential leak of an object</string> +// CHECK: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> +// CHECK: <key>type</key><string>Leak</string> +// CHECK: <key>location</key> +// CHECK: <dict> +// CHECK: <key>line</key><integer>52</integer> +// CHECK: <key>col</key><integer>5</integer> +// CHECK: <key>file</key><integer>0</integer> +// CHECK: </dict> +// CHECK: </dict> +// CHECK: </array> +// CHECK:</dict> +// CHECK:</plist> diff --git a/test/Analysis/outofbound.c b/test/Analysis/outofbound.c index 45786ec..81ed7ac 100644 --- a/test/Analysis/outofbound.c +++ b/test/Analysis/outofbound.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -Wno-array-bounds -analyze -analyzer-checker=core,alpha.unix,alpha.security.ArrayBound -analyzer-store=region -verify %s +// RUN: %clang_cc1 -Wno-array-bounds -analyze -analyzer-checker=core,unix,alpha.security.ArrayBound -analyzer-store=region -verify -analyzer-config unix:Optimistic=true %s typedef __typeof(sizeof(int)) size_t; void *malloc(size_t); diff --git a/test/Analysis/plist-macros.cpp b/test/Analysis/plist-macros.cpp index 0e8518a..64cef25 100644 --- a/test/Analysis/plist-macros.cpp +++ b/test/Analysis/plist-macros.cpp @@ -220,6 +220,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Memory allocated by malloc() should be deallocated by free(), not 'delete'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Bad deallocator</string> +// CHECK-NEXT: <key>check_name</key><string>unix.MismatchedDeallocator</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>noteOnMacro</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -314,6 +315,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Potential leak of memory pointed to by 'x'</string> // CHECK-NEXT: <key>category</key><string>Memory Error</string> // CHECK-NEXT: <key>type</key><string>Memory leak</string> +// CHECK-NEXT: <key>check_name</key><string>unix.Malloc</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>macroIsFirstInFunction</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -559,6 +561,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>macroInExpression</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -804,6 +807,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>macroInExpressionNoNote</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -903,7 +907,7 @@ void test2(int *p) { // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>45</integer> -// CHECK-NEXT: <key>col</key><integer>18</integer> +// CHECK-NEXT: <key>col</key><integer>21</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -1015,6 +1019,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>macroWithArgInExpression</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1158,6 +1163,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>useMultiNoteMacroWithError</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1364,6 +1370,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>useMultiNote</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1395,7 +1402,7 @@ void test2(int *p) { // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>82</integer> -// CHECK-NEXT: <key>col</key><integer>9</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -1424,7 +1431,7 @@ void test2(int *p) { // CHECK-NEXT: </dict> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>82</integer> -// CHECK-NEXT: <key>col</key><integer>9</integer> +// CHECK-NEXT: <key>col</key><integer>12</integer> // CHECK-NEXT: <key>file</key><integer>0</integer> // CHECK-NEXT: </dict> // CHECK-NEXT: </array> @@ -1584,6 +1591,7 @@ void test2(int *p) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'a')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>null_deref</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> diff --git a/test/Analysis/plist-output-alternate.m b/test/Analysis/plist-output-alternate.m index ea5ace6..45f0feb 100644 --- a/test/Analysis/plist-output-alternate.m +++ b/test/Analysis/plist-output-alternate.m @@ -158,6 +158,7 @@ void rdar8331641(int x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_init</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -301,6 +302,7 @@ void rdar8331641(int x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_assign</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -507,6 +509,7 @@ void rdar8331641(int x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'q')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_assign_transitive</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -684,6 +687,7 @@ void rdar8331641(int x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_cond</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -890,6 +894,7 @@ void rdar8331641(int x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_cond_transitive</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1067,6 +1072,7 @@ void rdar8331641(int x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_field</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1360,6 +1366,7 @@ void rdar8331641(int x) { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'value'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>rdar8331641</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> diff --git a/test/Analysis/plist-output.m b/test/Analysis/plist-output.m index f2823a0..4b4b800 100644 --- a/test/Analysis/plist-output.m +++ b/test/Analysis/plist-output.m @@ -295,6 +295,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_init</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -438,6 +439,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_assign</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -644,6 +646,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'q')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_assign_transitive</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -821,6 +824,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_cond</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1027,6 +1031,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_cond_transitive</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1204,6 +1209,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from field 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_null_field</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1507,6 +1513,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_assumptions</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -1776,6 +1783,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_cond_assign</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -1919,6 +1927,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1977,6 +1986,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Value stored to 'foo' during its initialization is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead initialization</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test2</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -2139,6 +2149,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'foo'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test2</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -2447,6 +2458,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>rdar12280665</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -2750,6 +2762,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>radar12322528_for</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -3053,6 +3066,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>radar12322528_while</string> // CHECK-NEXT: <key>issue_hash</key><string>7</string> @@ -3429,6 +3443,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>radar12322528_foo_2</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -3868,6 +3883,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_diagnostics</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -4341,6 +4357,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_diagnostics_2</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -4814,6 +4831,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_diagnostics_3</string> // CHECK-NEXT: <key>issue_hash</key><string>7</string> @@ -4860,6 +4878,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Value stored to 'x' is never read</string> // CHECK-NEXT: <key>category</key><string>Dead store</string> // CHECK-NEXT: <key>type</key><string>Dead increment</string> +// CHECK-NEXT: <key>check_name</key><string>deadcode.DeadStores</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_fast_enumeration</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -5066,6 +5085,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>The left expression of the compound assignment is an uninitialized value. The computed value will also be garbage</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Assigned value is garbage or undefined</string> +// CHECK-NEXT: <key>check_name</key><string>core.uninitialized.Assign</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_loop_fast_enumeration</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -5175,6 +5195,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from ivar 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -5284,6 +5305,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Null pointer passed as an argument to a 'nonnull' parameter</string> // CHECK-NEXT: <key>category</key><string>API</string> // CHECK-NEXT: <key>type</key><string>Argument with 'nonnull' attribute passed null</string> +// CHECK-NEXT: <key>check_name</key><string>core.NonNullParamChecker</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>RDar13295437</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -5524,6 +5546,7 @@ int testFoo(Foo *x) { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testFoo</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> diff --git a/test/Analysis/properties.m b/test/Analysis/properties.m index f5b5d92..bf9424c 100644 --- a/test/Analysis/properties.m +++ b/test/Analysis/properties.m @@ -3,6 +3,10 @@ void clang_analyzer_eval(int); +typedef const void * CFTypeRef; +extern CFTypeRef CFRetain(CFTypeRef cf); +void CFRelease(CFTypeRef cf); + typedef signed char BOOL; typedef unsigned int NSUInteger; typedef struct _NSZone NSZone; @@ -233,7 +237,7 @@ void testOverrelease(Person *p, int coin) { self->_name = 0; doSomethingWithName(other->_name); - [other.name release]; // expected-warning{{not owned}} + [other.name release]; // no-warning } - (void)deliberateReleaseFalseNegative { @@ -254,7 +258,7 @@ void testOverrelease(Person *p, int coin) { - (void)testRetainAndReleaseIVar { [self.name retain]; [_name release]; - [_name release]; // expected-warning{{not owned}} + [_name release]; } @end @@ -344,3 +348,337 @@ void testOpaqueConsistency(OpaqueIntWrapper *w) { clang_analyzer_eval(w.value == w.value); // expected-warning{{UNKNOWN}} } + +#if !__has_feature(objc_arc) +// Test quite a few cases of retain/release issues. + +@interface RetainCountTesting +@property (strong) id ownedProp; +@property (unsafe_unretained) id unownedProp; +@property (nonatomic, strong) id manualProp; +@property (readonly) id readonlyProp; +@property (nonatomic, readwrite/*, assign */) id implicitManualProp; // expected-warning {{'assign' is assumed}} expected-warning {{'assign' not appropriate}} +@property (nonatomic, readwrite/*, assign */) id implicitSynthProp; // expected-warning {{'assign' is assumed}} expected-warning {{'assign' not appropriate}} +@property CFTypeRef cfProp; +@end + +@implementation RetainCountTesting { + id _ivarOnly; +} + +- (id)manualProp { + return _manualProp; +} + +- (void)setImplicitManualProp:(id)newValue {} + +- (void)testOverreleaseOwnedIvar { + [_ownedProp retain]; + [_ownedProp release]; + [_ownedProp release]; + [_ownedProp release]; // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseUnownedIvar { + [_unownedProp retain]; + [_unownedProp release]; + [_unownedProp release]; // FIXME-warning{{not owned at this point by the caller}} +} + +- (void)testOverreleaseIvarOnly { + [_ivarOnly retain]; + [_ivarOnly release]; + [_ivarOnly release]; + [_ivarOnly release]; // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseReadonlyIvar { + [_readonlyProp retain]; + [_readonlyProp release]; + [_readonlyProp release]; + [_readonlyProp release]; // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseImplicitManualIvar { + [_implicitManualProp retain]; + [_implicitManualProp release]; + [_implicitManualProp release]; + [_implicitManualProp release]; // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseImplicitSynthIvar { + [_implicitSynthProp retain]; + [_implicitSynthProp release]; + [_implicitSynthProp release]; // FIXME-warning{{not owned at this point by the caller}} +} + +- (void)testOverreleaseCF { + CFRetain(_cfProp); + CFRelease(_cfProp); + CFRelease(_cfProp); + CFRelease(_cfProp); // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseOwnedIvarUse { + [_ownedProp retain]; + [_ownedProp release]; + [_ownedProp release]; + [_ownedProp myMethod]; // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseIvarOnlyUse { + [_ivarOnly retain]; + [_ivarOnly release]; + [_ivarOnly release]; + [_ivarOnly myMethod]; // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseCFUse { + CFRetain(_cfProp); + CFRelease(_cfProp); + CFRelease(_cfProp); + + extern void CFUse(CFTypeRef); + CFUse(_cfProp); // FIXME-warning{{used after it is released}} +} + +- (void)testOverreleaseOwnedIvarAutoreleaseOkay { + [_ownedProp retain]; + [_ownedProp release]; + [_ownedProp autorelease]; +} // no-warning + +- (void)testOverreleaseIvarOnlyAutoreleaseOkay { + [_ivarOnly retain]; + [_ivarOnly release]; + [_ivarOnly autorelease]; +} // no-warning + +- (void)testOverreleaseOwnedIvarAutorelease { + [_ownedProp retain]; + [_ownedProp release]; + [_ownedProp autorelease]; + [_ownedProp autorelease]; +} // FIXME-warning{{Object autoreleased too many times}} + +- (void)testOverreleaseIvarOnlyAutorelease { + [_ivarOnly retain]; + [_ivarOnly release]; + [_ivarOnly autorelease]; + [_ivarOnly autorelease]; +} // FIXME-warning{{Object autoreleased too many times}} + +- (void)testPropertyAccessThenReleaseOwned { + id owned = [self.ownedProp retain]; + [owned release]; + [_ownedProp release]; + clang_analyzer_eval(owned == _ownedProp); // expected-warning{{TRUE}} +} + +- (void)testPropertyAccessThenReleaseOwned2 { + id fromIvar = _ownedProp; + id owned = [self.ownedProp retain]; + [owned release]; + [fromIvar release]; + clang_analyzer_eval(owned == fromIvar); // expected-warning{{TRUE}} +} + +- (void)testPropertyAccessThenReleaseUnowned { + id unowned = [self.unownedProp retain]; + [unowned release]; + [_unownedProp release]; // FIXME-warning{{not owned}} +} + +- (void)testPropertyAccessThenReleaseUnowned2 { + id fromIvar = _unownedProp; + id unowned = [self.unownedProp retain]; + [unowned release]; + clang_analyzer_eval(unowned == fromIvar); // expected-warning{{TRUE}} + [fromIvar release]; // FIXME-warning{{not owned}} +} + +- (void)testPropertyAccessThenReleaseManual { + id prop = [self.manualProp retain]; + [prop release]; + [_manualProp release]; // no-warning +} + +- (void)testPropertyAccessThenReleaseManual2 { + id fromIvar = _manualProp; + id prop = [self.manualProp retain]; + [prop release]; + clang_analyzer_eval(prop == fromIvar); // expected-warning{{TRUE}} + [fromIvar release]; // no-warning +} + +- (void)testPropertyAccessThenReleaseCF { + CFTypeRef owned = CFRetain(self.cfProp); + CFRelease(owned); + CFRelease(_cfProp); // no-warning + clang_analyzer_eval(owned == _cfProp); // expected-warning{{TRUE}} +} + +- (void)testPropertyAccessThenReleaseCF2 { + CFTypeRef fromIvar = _cfProp; + CFTypeRef owned = CFRetain(self.cfProp); + CFRelease(owned); + CFRelease(fromIvar); + clang_analyzer_eval(owned == fromIvar); // expected-warning{{TRUE}} +} + +- (void)testPropertyAccessThenReleaseReadonly { + id prop = [self.readonlyProp retain]; + [prop release]; + [_readonlyProp release]; // no-warning +} + +- (void)testPropertyAccessThenReleaseReadonly2 { + id fromIvar = _readonlyProp; + id prop = [self.readonlyProp retain]; + [prop release]; + clang_analyzer_eval(prop == fromIvar); // expected-warning{{TRUE}} + [fromIvar release]; // no-warning +} + +- (void)testPropertyAccessThenReleaseImplicitManual { + id prop = [self.implicitManualProp retain]; + [prop release]; + [_implicitManualProp release]; // no-warning +} + +- (void)testPropertyAccessThenReleaseImplicitManual2 { + id fromIvar = _implicitManualProp; + id prop = [self.implicitManualProp retain]; + [prop release]; + clang_analyzer_eval(prop == fromIvar); // expected-warning{{TRUE}} + [fromIvar release]; // no-warning +} + +- (void)testPropertyAccessThenReleaseImplicitSynth { + id prop = [self.implicitSynthProp retain]; + [prop release]; + [_implicitSynthProp release]; // FIXME-warning{{not owned}} +} + +- (void)testPropertyAccessThenReleaseImplicitSynth2 { + id fromIvar = _implicitSynthProp; + id prop = [self.implicitSynthProp retain]; + [prop release]; + clang_analyzer_eval(prop == fromIvar); // expected-warning{{TRUE}} + [fromIvar release]; // FIXME-warning{{not owned}} +} + +- (id)getUnownedFromProperty { + [_ownedProp retain]; + [_ownedProp autorelease]; + return _ownedProp; // no-warning +} + +- (id)transferUnownedFromProperty { + [_ownedProp retain]; + [_ownedProp autorelease]; + return [_ownedProp autorelease]; // no-warning +} + +- (id)transferOwnedFromProperty __attribute__((ns_returns_retained)) { + [_ownedProp retain]; + [_ownedProp autorelease]; + return _ownedProp; // no-warning +} + +- (void)testAssignOwned:(id)newValue { + _ownedProp = newValue; + [_ownedProp release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignUnowned:(id)newValue { + _unownedProp = newValue; + [_unownedProp release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignIvarOnly:(id)newValue { + _ivarOnly = newValue; + [_ivarOnly release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignCF:(CFTypeRef)newValue { + _cfProp = newValue; + CFRelease(_cfProp); // FIXME: no-warning{{not owned}} +} + +- (void)testAssignReadonly:(id)newValue { + _readonlyProp = newValue; + [_readonlyProp release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignImplicitManual:(id)newValue { + _implicitManualProp = newValue; + [_implicitManualProp release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignImplicitSynth:(id)newValue { + _implicitSynthProp = newValue; + [_implicitSynthProp release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignOwnedOkay:(id)newValue { + _ownedProp = [newValue retain]; + [_ownedProp release]; // no-warning +} + +- (void)testAssignUnownedOkay:(id)newValue { + _unownedProp = [newValue retain]; + [_unownedProp release]; // no-warning +} + +- (void)testAssignIvarOnlyOkay:(id)newValue { + _ivarOnly = [newValue retain]; + [_ivarOnly release]; // no-warning +} + +- (void)testAssignCFOkay:(CFTypeRef)newValue { + _cfProp = CFRetain(newValue); + CFRelease(_cfProp); // no-warning +} + +- (void)testAssignReadonlyOkay:(id)newValue { + _readonlyProp = [newValue retain]; + [_readonlyProp release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignImplicitManualOkay:(id)newValue { + _implicitManualProp = [newValue retain]; + [_implicitManualProp release]; // FIXME: no-warning{{not owned}} +} + +- (void)testAssignImplicitSynthOkay:(id)newValue { + _implicitSynthProp = [newValue retain]; + [_implicitSynthProp release]; // FIXME: no-warning{{not owned}} +} + +// rdar://problem/19862648 +- (void)establishIvarIsNilDuringLoops { + extern id getRandomObject(); + + int i = 4; // Must be at least 4 to trigger the bug. + while (--i) { + id x = 0; + if (getRandomObject()) + x = _ivarOnly; + if (!x) + x = getRandomObject(); + [x myMethod]; + } +} + +// rdar://problem/20335433 +- (void)retainIvarAndInvalidateSelf { + extern void invalidate(id); + [_unownedProp retain]; + invalidate(self); + [_unownedProp release]; // no-warning +} + +@end +#endif // non-ARC + diff --git a/test/Analysis/redefined_system.c b/test/Analysis/redefined_system.c index ae5bf26..16f03ab 100644 --- a/test/Analysis/redefined_system.c +++ b/test/Analysis/redefined_system.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=unix,core,alpha.security.taint -w -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=osx,unix,core,alpha.security.taint -w -verify %s // expected-no-diagnostics // Make sure we don't crash when someone redefines a system function we reason about. diff --git a/test/Analysis/retain-release-path-notes-gc.m b/test/Analysis/retain-release-path-notes-gc.m index 40592f0..aa783b5 100644 --- a/test/Analysis/retain-release-path-notes-gc.m +++ b/test/Analysis/retain-release-path-notes-gc.m @@ -208,6 +208,7 @@ void retainReleaseIgnored () { // CHECK-NEXT: <key>description</key><string>Potential leak (when using garbage collection) of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak of object when using garbage collection</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>creationViaCFCreate</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -651,6 +652,7 @@ void retainReleaseIgnored () { // CHECK-NEXT: <key>description</key><string>Potential leak (when using garbage collection) of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak of object when using garbage collection</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>makeCollectable</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1019,6 +1021,7 @@ void retainReleaseIgnored () { // CHECK-NEXT: <key>description</key><string>Incorrect decrement of the reference count of an object that is not owned at this point by the caller</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Bad release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>retainReleaseIgnored</string> // CHECK-NEXT: <key>issue_hash</key><string>5</string> @@ -1203,6 +1206,7 @@ void retainReleaseIgnored () { // CHECK-NEXT: <key>description</key><string>Potential leak (when using garbage collection) of an object stored into 'object'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak of returned object when using garbage collection</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>getViolation</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1387,6 +1391,7 @@ void retainReleaseIgnored () { // CHECK-NEXT: <key>description</key><string>Potential leak (when using garbage collection) of an object stored into 'object'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak of returned object when using garbage collection</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>copyViolation</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> diff --git a/test/Analysis/retain-release-path-notes.m b/test/Analysis/retain-release-path-notes.m index 4b16c71..6b51305 100644 --- a/test/Analysis/retain-release-path-notes.m +++ b/test/Analysis/retain-release-path-notes.m @@ -263,6 +263,71 @@ void CFAutoreleaseUnownedMixed() { return; // expected-warning{{Object autoreleased too many times}} expected-note{{Object was autoreleased 2 times but the object has a +0 retain count}} } +@interface PropertiesAndIvars : NSObject +@property (strong) id ownedProp; +@property (unsafe_unretained) id unownedProp; +@property (nonatomic, strong) id manualProp; +@end + +@interface NSObject (PropertiesAndIvarsHelper) +- (void)myMethod; +@end + +@implementation PropertiesAndIvars { + id _ivarOnly; +} + +- (id)manualProp { + return _manualProp; +} + +- (void)testOverreleaseUnownedIvar { + [_unownedProp retain]; // FIXME-note {{Object loaded from instance variable}} + // FIXME-note@-1 {{Reference count incremented. The object now has a +1 retain count}} + [_unownedProp release]; // FIXME-note {{Reference count decremented}} + [_unownedProp release]; // FIXME-note {{Incorrect decrement of the reference count of an object that is not owned at this point by the caller}} + // FIXME-warning@-1 {{not owned at this point by the caller}} +} + +- (void)testOverreleaseOwnedIvarUse { + [_ownedProp retain]; // FIXME-note {{Object loaded from instance variable}} + // FIXME-note@-1 {{Reference count incremented. The object now has a +1 retain count}} + [_ownedProp release]; // FIXME-note {{Reference count decremented}} + [_ownedProp release]; // FIXME-note {{Strong instance variable relinquished. Object released}} + [_ownedProp myMethod]; // FIXME-note {{Reference-counted object is used after it is released}} + // FIXME-warning@-1 {{used after it is released}} +} + +- (void)testOverreleaseIvarOnlyUse { + [_ivarOnly retain]; // FIXME-note {{Object loaded from instance variable}} + // FIXME-note@-1 {{Reference count incremented. The object now has a +1 retain count}} + [_ivarOnly release]; // FIXME-note {{Reference count decremented}} + [_ivarOnly release]; // FIXME-note {{Strong instance variable relinquished. Object released}} + [_ivarOnly myMethod]; // FIXME-note {{Reference-counted object is used after it is released}} + // FIXME-warning@-1 {{used after it is released}} +} + +- (void)testOverreleaseOwnedIvarAutorelease { + [_ownedProp retain]; // FIXME-note {{Object loaded from instance variable}} + // FIXME-note@-1 {{Reference count incremented. The object now has a +1 retain count}} + [_ownedProp release]; // FIXME-note {{Reference count decremented}} + [_ownedProp autorelease]; // FIXME-note {{Object autoreleased}} + [_ownedProp autorelease]; // FIXME-note {{Object autoreleased}} + // FIXME-note@+1 {{Object was autoreleased 2 times but the object has a +0 retain count}} +} // FIXME-warning{{Object autoreleased too many times}} + +- (void)testOverreleaseIvarOnlyAutorelease { + [_ivarOnly retain]; // FIXME-note {{Object loaded from instance variable}} + // FIXME-note@-1 {{Reference count incremented. The object now has a +1 retain count}} + [_ivarOnly release]; // FIXME-note {{Reference count decremented}} + [_ivarOnly autorelease]; // FIXME-note {{Object autoreleased}} + [_ivarOnly autorelease]; // FIXME-note {{Object autoreleased}} + // FIXME-note@+1 {{Object was autoreleased 2 times but the object has a +0 retain count}} +} // FIXME-warning{{Object autoreleased too many times}} + +@end + + // CHECK: <key>diagnostics</key> // CHECK-NEXT: <array> @@ -399,6 +464,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>creationViaAlloc</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -542,6 +608,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>creationViaCFCreate</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -910,6 +977,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>acquisitionViaMethod</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1128,6 +1196,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>acquisitionViaProperty</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1346,6 +1415,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>acquisitionViaCFFunction</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1564,6 +1634,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Reference-counted object is used after it is released</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Use-after-release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>explicitDealloc</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -1782,6 +1853,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Reference-counted object is used after it is released</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Use-after-release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>implicitDealloc</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -2075,6 +2147,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object autoreleased too many times</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Object autoreleased too many times</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>overAutorelease</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -2293,6 +2366,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object autoreleased too many times</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Object autoreleased too many times</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>autoreleaseUnowned</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -2586,6 +2660,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'leaked'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>makeCollectableIgnored</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -2770,6 +2845,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Method should return an owned object</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>CFCopyRuleViolation</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -2954,6 +3030,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'object'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak of returned object</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>CFGetRuleViolation</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3138,6 +3215,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Method should return an owned object</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>copyViolation</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -3322,6 +3400,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Method should return an owned object</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>copyViolationIndexedSubscript</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -3506,6 +3585,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Method should return an owned object</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>copyViolationKeyedSubscript</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -3690,6 +3770,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object stored into 'result'</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak of returned object</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>getViolation</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -3908,6 +3989,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object with a +0 retain count returned to caller where a +1 (owning) retain count is expected</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Method should return an owned object</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>copyAutorelease</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -4051,6 +4133,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Incorrect decrement of the reference count of an object that is not owned at this point by the caller</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Bad release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testNumericLiteral</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -4194,6 +4277,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Incorrect decrement of the reference count of an object that is not owned at this point by the caller</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Bad release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testBoxedInt</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -4337,6 +4421,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Incorrect decrement of the reference count of an object that is not owned at this point by the caller</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Bad release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testBoxedString</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -4480,6 +4565,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Incorrect decrement of the reference count of an object that is not owned at this point by the caller</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Bad release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testArray</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -4623,6 +4709,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Incorrect decrement of the reference count of an object that is not owned at this point by the caller</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Bad release</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>testDictionary</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -5003,6 +5090,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -5354,6 +5442,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Potential leak of an object</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Leak</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>Objective-C method</string> // CHECK-NEXT: <key>issue_context</key><string>test</string> // CHECK-NEXT: <key>issue_hash</key><string>8</string> @@ -5647,6 +5736,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object autoreleased too many times</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Object autoreleased too many times</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>CFOverAutorelease</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> @@ -5865,6 +5955,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object autoreleased too many times</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Object autoreleased too many times</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>CFAutoreleaseUnowned</string> // CHECK-NEXT: <key>issue_hash</key><string>3</string> @@ -6158,6 +6249,7 @@ void CFAutoreleaseUnownedMixed() { // CHECK-NEXT: <key>description</key><string>Object autoreleased too many times</string> // CHECK-NEXT: <key>category</key><string>Memory (Core Foundation/Objective-C)</string> // CHECK-NEXT: <key>type</key><string>Object autoreleased too many times</string> +// CHECK-NEXT: <key>check_name</key><string>osx.cocoa.RetainCount</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>CFAutoreleaseUnownedMixed</string> // CHECK-NEXT: <key>issue_hash</key><string>4</string> diff --git a/test/Analysis/security-syntax-checks.m b/test/Analysis/security-syntax-checks.m index 4ffd9a0..9b7fb25 100644 --- a/test/Analysis/security-syntax-checks.m +++ b/test/Analysis/security-syntax-checks.m @@ -2,6 +2,10 @@ // RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -DUSE_BUILTINS -analyzer-checker=security.insecureAPI,security.FloatLoopCounter %s -verify // RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -DVARIANT -analyzer-checker=security.insecureAPI,security.FloatLoopCounter %s -verify // RUN: %clang_cc1 -triple i386-apple-darwin10 -analyze -DUSE_BUILTINS -DVARIANT -analyzer-checker=security.insecureAPI,security.FloatLoopCounter %s -verify +// RUN: %clang_cc1 -triple x86_64-unknown-cloudabi -analyze -analyzer-checker=security.insecureAPI,security.FloatLoopCounter %s -verify +// RUN: %clang_cc1 -triple x86_64-unknown-cloudabi -analyze -DUSE_BUILTINS -analyzer-checker=security.insecureAPI,security.FloatLoopCounter %s -verify +// RUN: %clang_cc1 -triple x86_64-unknown-cloudabi -analyze -DVARIANT -analyzer-checker=security.insecureAPI,security.FloatLoopCounter %s -verify +// RUN: %clang_cc1 -triple x86_64-unknown-cloudabi -analyze -DUSE_BUILTINS -DVARIANT -analyzer-checker=security.insecureAPI,security.FloatLoopCounter %s -verify #ifdef USE_BUILTINS # define BUILTIN(f) __builtin_ ## f diff --git a/test/Analysis/stack-addr-ps.c b/test/Analysis/stack-addr-ps.c index a443a32..d668f8f 100644 --- a/test/Analysis/stack-addr-ps.c +++ b/test/Analysis/stack-addr-ps.c @@ -90,3 +90,10 @@ RDar10348049 test_rdar10348049(void) { return b; // no-warning } +void testRegister(register const char *reg) { + if (reg) (void)reg[0]; +} +void callTestRegister() { + char buf[20]; + testRegister(buf); // no-warning +} diff --git a/test/Analysis/undef-buffers.c b/test/Analysis/undef-buffers.c index f18d6e5..1581b2b 100644 --- a/test/Analysis/undef-buffers.c +++ b/test/Analysis/undef-buffers.c @@ -1,4 +1,4 @@ -// RUN: %clang_cc1 -analyze -analyzer-checker=core,alpha.unix,core.uninitialized -analyzer-store=region -verify %s +// RUN: %clang_cc1 -analyze -analyzer-checker=core,unix,core.uninitialized -analyzer-store=region -verify -analyzer-config unix:Optimistic=true %s typedef __typeof(sizeof(int)) size_t; void *malloc(size_t); void free(void *); diff --git a/test/Analysis/unix-fns.c b/test/Analysis/unix-fns.c index dad03fa..d591e6b 100644 --- a/test/Analysis/unix-fns.c +++ b/test/Analysis/unix-fns.c @@ -406,6 +406,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'open' requires a third argument when the 'O_CREAT' flag is set</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Improper use of 'open'</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_open</string> // CHECK-NEXT: <key>issue_hash</key><string>6</string> @@ -554,6 +555,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'dispatch_once' uses the local variable 'pred' for the predicate value. Using such transient memory for the predicate is potentially dangerous. Perhaps you intended to declare the variable as 'static'?</string> // CHECK-NEXT: <key>category</key><string>API Misuse (Apple)</string> // CHECK-NEXT: <key>type</key><string>Improper use of 'dispatch_once'</string> +// CHECK-NEXT: <key>check_name</key><string>osx.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_dispatch_once</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -634,6 +636,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'pthread_once' uses the local variable 'pred' for the "control" value. Using such transient memory for the control value is potentially dangerous. Perhaps you intended to declare the variable as 'static'?</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Improper use of 'pthread_once'</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_pthread_once</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -714,6 +717,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'malloc' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>pr2899</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -794,6 +798,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'calloc' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_calloc</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -874,6 +879,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'calloc' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_calloc2</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -954,6 +960,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'realloc' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_realloc</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1034,6 +1041,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'reallocf' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_reallocf</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1114,6 +1122,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'alloca' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_alloca</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1194,6 +1203,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'alloca' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_builtin_alloca</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1274,6 +1284,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'valloc' has an allocation size of 0 bytes</string> // CHECK-NEXT: <key>category</key><string>Unix API</string> // CHECK-NEXT: <key>type</key><string>Undefined allocation of 0 bytes (CERT MEM04-C; CWE-131)</string> +// CHECK-NEXT: <key>check_name</key><string>unix.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_valloc</string> // CHECK-NEXT: <key>issue_hash</key><string>1</string> @@ -1354,6 +1365,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Call to 'dispatch_once' uses the local variable 'pred' for the predicate value. Using such transient memory for the predicate is potentially dangerous. Perhaps you intended to declare the variable as 'static'?</string> // CHECK-NEXT: <key>category</key><string>API Misuse (Apple)</string> // CHECK-NEXT: <key>type</key><string>Improper use of 'dispatch_once'</string> +// CHECK-NEXT: <key>check_name</key><string>osx.API</string> // CHECK-NEXT: <key>issue_context_kind</key><string>function</string> // CHECK-NEXT: <key>issue_context</key><string>test_dispatch_once_in_macro</string> // CHECK-NEXT: <key>issue_hash</key><string>2</string> @@ -1763,6 +1775,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>192</integer> @@ -2149,6 +2162,7 @@ void test_inline_dispatch_once() { // CHECK-NEXT: <key>description</key><string>Dereference of null pointer (loaded from variable 'p')</string> // CHECK-NEXT: <key>category</key><string>Logic error</string> // CHECK-NEXT: <key>type</key><string>Dereference of null pointer</string> +// CHECK-NEXT: <key>check_name</key><string>core.NullDereference</string> // CHECK-NEXT: <key>location</key> // CHECK-NEXT: <dict> // CHECK-NEXT: <key>line</key><integer>202</integer> |