Rename 'free' in warning messages to 'release' (#150935)
Changed the warning message: - **From**: 'Attempt to free released memory' **To**: 'Attempt to release already released memory' - **From**: 'Attempt to free non-owned memory' **To**: 'Attempt to release non-owned memory' - **From**: 'Use of memory after it is freed' **To**: 'Use of memory after it is released' All connected tests and their expectations have been changed accordingly. Inspired by [this PR](https://github.com/llvm/llvm-project/pull/147542#discussion_r2195197922)
This commit is contained in:
parent
837b2d464f
commit
f0c90dfcd8
@ -16,5 +16,5 @@ void af2() {
|
|||||||
void *p = my_malloc(12);
|
void *p = my_malloc(12);
|
||||||
my_free(p);
|
my_free(p);
|
||||||
free(p);
|
free(p);
|
||||||
// CHECK: warning: Attempt to free released memory [clang-analyzer-unix.Malloc]
|
// CHECK: warning: Attempt to release already released memory [clang-analyzer-unix.Malloc]
|
||||||
}
|
}
|
||||||
|
@ -7,12 +7,12 @@ void f() {
|
|||||||
int *p = new int(42);
|
int *p = new int(42);
|
||||||
delete p;
|
delete p;
|
||||||
delete p;
|
delete p;
|
||||||
// CHECK: warning: Attempt to free released memory [clang-analyzer-cplusplus.NewDelete]
|
// CHECK: warning: Attempt to release already released memory [clang-analyzer-cplusplus.NewDelete]
|
||||||
}
|
}
|
||||||
|
|
||||||
void g() {
|
void g() {
|
||||||
void *q = malloc(132);
|
void *q = malloc(132);
|
||||||
free(q);
|
free(q);
|
||||||
free(q);
|
free(q);
|
||||||
// CHECK: warning: Attempt to free released memory [clang-analyzer-unix.Malloc]
|
// CHECK: warning: Attempt to release already released memory [clang-analyzer-unix.Malloc]
|
||||||
}
|
}
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
void test() {
|
void test() {
|
||||||
int *p = malloc(1);
|
int *p = malloc(1);
|
||||||
free(p);
|
free(p);
|
||||||
free(p); // warn: attempt to free released memory
|
free(p); // warn: attempt to release already released memory
|
||||||
}
|
}
|
||||||
|
|
||||||
void test() {
|
void test() {
|
||||||
|
@ -2693,7 +2693,7 @@ void MallocChecker::HandleUseAfterFree(CheckerContext &C, SourceRange Range,
|
|||||||
Frontend->UseFreeBug,
|
Frontend->UseFreeBug,
|
||||||
AF.Kind == AF_InnerBuffer
|
AF.Kind == AF_InnerBuffer
|
||||||
? "Inner pointer of container used after re/deallocation"
|
? "Inner pointer of container used after re/deallocation"
|
||||||
: "Use of memory after it is freed",
|
: "Use of memory after it is released",
|
||||||
N);
|
N);
|
||||||
|
|
||||||
R->markInteresting(Sym);
|
R->markInteresting(Sym);
|
||||||
@ -2721,8 +2721,8 @@ void MallocChecker::HandleDoubleFree(CheckerContext &C, SourceRange Range,
|
|||||||
if (ExplodedNode *N = C.generateErrorNode()) {
|
if (ExplodedNode *N = C.generateErrorNode()) {
|
||||||
auto R = std::make_unique<PathSensitiveBugReport>(
|
auto R = std::make_unique<PathSensitiveBugReport>(
|
||||||
Frontend->DoubleFreeBug,
|
Frontend->DoubleFreeBug,
|
||||||
(Released ? "Attempt to free released memory"
|
(Released ? "Attempt to release already released memory"
|
||||||
: "Attempt to free non-owned memory"),
|
: "Attempt to release non-owned memory"),
|
||||||
N);
|
N);
|
||||||
if (Range.isValid())
|
if (Range.isValid())
|
||||||
R->addRange(Range);
|
R->addRange(Range);
|
||||||
|
@ -33,9 +33,9 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>depth</key><integer>0</integer>
|
<key>depth</key><integer>0</integer>
|
||||||
<key>extended_message</key>
|
<key>extended_message</key>
|
||||||
<string>Attempt to free released memory</string>
|
<string>Attempt to release already released memory</string>
|
||||||
<key>message</key>
|
<key>message</key>
|
||||||
<string>Attempt to free released memory</string>
|
<string>Attempt to release already released memory</string>
|
||||||
</dict>
|
</dict>
|
||||||
<dict>
|
<dict>
|
||||||
<key>kind</key><string>control</string>
|
<key>kind</key><string>control</string>
|
||||||
@ -232,7 +232,7 @@
|
|||||||
</array>
|
</array>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>description</key><string>Attempt to free released memory</string>
|
<key>description</key><string>Attempt to release already released memory</string>
|
||||||
<key>category</key><string>Memory error</string>
|
<key>category</key><string>Memory error</string>
|
||||||
<key>type</key><string>Double free</string>
|
<key>type</key><string>Double free</string>
|
||||||
<key>check_name</key><string>cplusplus.NewDelete</string>
|
<key>check_name</key><string>cplusplus.NewDelete</string>
|
||||||
@ -456,12 +456,12 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>depth</key><integer>0</integer>
|
<key>depth</key><integer>0</integer>
|
||||||
<key>extended_message</key>
|
<key>extended_message</key>
|
||||||
<string>Attempt to free released memory</string>
|
<string>Attempt to release already released memory</string>
|
||||||
<key>message</key>
|
<key>message</key>
|
||||||
<string>Attempt to free released memory</string>
|
<string>Attempt to release already released memory</string>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>description</key><string>Attempt to free released memory</string>
|
<key>description</key><string>Attempt to release already released memory</string>
|
||||||
<key>category</key><string>Memory error</string>
|
<key>category</key><string>Memory error</string>
|
||||||
<key>type</key><string>Double free</string>
|
<key>type</key><string>Double free</string>
|
||||||
<key>check_name</key><string>cplusplus.NewDelete</string>
|
<key>check_name</key><string>cplusplus.NewDelete</string>
|
||||||
|
@ -1725,12 +1725,12 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>depth</key><integer>0</integer>
|
<key>depth</key><integer>0</integer>
|
||||||
<key>extended_message</key>
|
<key>extended_message</key>
|
||||||
<string>Use of memory after it is freed</string>
|
<string>Use of memory after it is released</string>
|
||||||
<key>message</key>
|
<key>message</key>
|
||||||
<string>Use of memory after it is freed</string>
|
<string>Use of memory after it is released</string>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>description</key><string>Use of memory after it is freed</string>
|
<key>description</key><string>Use of memory after it is released</string>
|
||||||
<key>category</key><string>Memory error</string>
|
<key>category</key><string>Memory error</string>
|
||||||
<key>type</key><string>Use-after-free</string>
|
<key>type</key><string>Use-after-free</string>
|
||||||
<key>check_name</key><string>unix.Malloc</string>
|
<key>check_name</key><string>unix.Malloc</string>
|
||||||
@ -2985,12 +2985,12 @@
|
|||||||
</array>
|
</array>
|
||||||
<key>depth</key><integer>0</integer>
|
<key>depth</key><integer>0</integer>
|
||||||
<key>extended_message</key>
|
<key>extended_message</key>
|
||||||
<string>Use of memory after it is freed</string>
|
<string>Use of memory after it is released</string>
|
||||||
<key>message</key>
|
<key>message</key>
|
||||||
<string>Use of memory after it is freed</string>
|
<string>Use of memory after it is released</string>
|
||||||
</dict>
|
</dict>
|
||||||
</array>
|
</array>
|
||||||
<key>description</key><string>Use of memory after it is freed</string>
|
<key>description</key><string>Use of memory after it is released</string>
|
||||||
<key>category</key><string>Memory error</string>
|
<key>category</key><string>Memory error</string>
|
||||||
<key>type</key><string>Use-after-free</string>
|
<key>type</key><string>Use-after-free</string>
|
||||||
<key>check_name</key><string>unix.Malloc</string>
|
<key>check_name</key><string>unix.Malloc</string>
|
||||||
|
@ -12,7 +12,7 @@ void DeleteInHeader::operator delete(void *ptr) {
|
|||||||
|
|
||||||
::operator delete(ptr);
|
::operator delete(ptr);
|
||||||
|
|
||||||
self->data = 2; // expected-warning {{Use of memory after it is freed [cplusplus.NewDelete]}}
|
self->data = 2; // expected-warning {{Use of memory after it is released [cplusplus.NewDelete]}}
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // OVERLOADED_DELETE_IN_SYSTEM_HEADER
|
#endif // OVERLOADED_DELETE_IN_SYSTEM_HEADER
|
||||||
|
@ -9,7 +9,7 @@
|
|||||||
void testMallocDoubleFree() {
|
void testMallocDoubleFree() {
|
||||||
int *p = (int *)malloc(sizeof(int));
|
int *p = (int *)malloc(sizeof(int));
|
||||||
free(p);
|
free(p);
|
||||||
free(p); // expected-warning{{Attempt to free released memory}}
|
free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMallocLeak() {
|
void testMallocLeak() {
|
||||||
@ -19,7 +19,7 @@ void testMallocLeak() {
|
|||||||
void testMallocUseAfterFree() {
|
void testMallocUseAfterFree() {
|
||||||
int *p = (int *)malloc(sizeof(int));
|
int *p = (int *)malloc(sizeof(int));
|
||||||
free(p);
|
free(p);
|
||||||
int j = *p; // expected-warning{{Use of memory after it is freed}}
|
int j = *p; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMallocBadFree() {
|
void testMallocBadFree() {
|
||||||
@ -46,7 +46,7 @@ void testMismatchedDeallocator() {
|
|||||||
void testNewDoubleFree() {
|
void testNewDoubleFree() {
|
||||||
int *p = new int;
|
int *p = new int;
|
||||||
delete p;
|
delete p;
|
||||||
delete p; // expected-warning{{Attempt to free released memory}}
|
delete p; // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testNewLeak() {
|
void testNewLeak() {
|
||||||
@ -59,7 +59,7 @@ void testNewLeak() {
|
|||||||
void testNewUseAfterFree() {
|
void testNewUseAfterFree() {
|
||||||
int *p = (int *)operator new(0);
|
int *p = (int *)operator new(0);
|
||||||
delete p;
|
delete p;
|
||||||
int j = *p; // expected-warning{{Use of memory after it is freed}}
|
int j = *p; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testNewBadFree() {
|
void testNewBadFree() {
|
||||||
@ -95,7 +95,7 @@ void testShouldReportDoubleFreeNotMismatched() {
|
|||||||
int *p = (int*)malloc(sizeof(int)*4);
|
int *p = (int*)malloc(sizeof(int)*4);
|
||||||
globalPtr = p;
|
globalPtr = p;
|
||||||
free(p);
|
free(p);
|
||||||
delete globalPtr; // expected-warning {{Attempt to free released memory}}
|
delete globalPtr; // expected-warning {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
int *allocIntArray(unsigned c) {
|
int *allocIntArray(unsigned c) {
|
||||||
return new int[c];
|
return new int[c];
|
||||||
|
@ -155,52 +155,52 @@ void g(SomeClass &c, ...);
|
|||||||
void testUseFirstArgAfterDelete() {
|
void testUseFirstArgAfterDelete() {
|
||||||
int *p = new int;
|
int *p = new int;
|
||||||
delete p;
|
delete p;
|
||||||
f(p); // newdelete-warning{{Use of memory after it is freed}}
|
f(p); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUseMiddleArgAfterDelete(int *p) {
|
void testUseMiddleArgAfterDelete(int *p) {
|
||||||
delete p;
|
delete p;
|
||||||
f(0, p); // newdelete-warning{{Use of memory after it is freed}}
|
f(0, p); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUseLastArgAfterDelete(int *p) {
|
void testUseLastArgAfterDelete(int *p) {
|
||||||
delete p;
|
delete p;
|
||||||
f(0, 0, p); // newdelete-warning{{Use of memory after it is freed}}
|
f(0, 0, p); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUseSeveralArgsAfterDelete(int *p) {
|
void testUseSeveralArgsAfterDelete(int *p) {
|
||||||
delete p;
|
delete p;
|
||||||
f(p, p, p); // newdelete-warning{{Use of memory after it is freed}}
|
f(p, p, p); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUseRefArgAfterDelete(SomeClass &c) {
|
void testUseRefArgAfterDelete(SomeClass &c) {
|
||||||
delete &c;
|
delete &c;
|
||||||
g(c); // newdelete-warning{{Use of memory after it is freed}}
|
g(c); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testVariadicArgAfterDelete() {
|
void testVariadicArgAfterDelete() {
|
||||||
SomeClass c;
|
SomeClass c;
|
||||||
int *p = new int;
|
int *p = new int;
|
||||||
delete p;
|
delete p;
|
||||||
g(c, 0, p); // newdelete-warning{{Use of memory after it is freed}}
|
g(c, 0, p); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUseMethodArgAfterDelete(int *p) {
|
void testUseMethodArgAfterDelete(int *p) {
|
||||||
SomeClass *c = new SomeClass;
|
SomeClass *c = new SomeClass;
|
||||||
delete p;
|
delete p;
|
||||||
c->f(p); // newdelete-warning{{Use of memory after it is freed}}
|
c->f(p); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUseThisAfterDelete() {
|
void testUseThisAfterDelete() {
|
||||||
SomeClass *c = new SomeClass;
|
SomeClass *c = new SomeClass;
|
||||||
delete c;
|
delete c;
|
||||||
c->f(0); // newdelete-warning{{Use of memory after it is freed}}
|
c->f(0); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testDoubleDelete() {
|
void testDoubleDelete() {
|
||||||
int *p = new int;
|
int *p = new int;
|
||||||
delete p;
|
delete p;
|
||||||
delete p; // newdelete-warning{{Attempt to free released memory}}
|
delete p; // newdelete-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testExprDeleteArg() {
|
void testExprDeleteArg() {
|
||||||
@ -412,7 +412,7 @@ public:
|
|||||||
void testDoubleDeleteClassInstance() {
|
void testDoubleDeleteClassInstance() {
|
||||||
DerefClass *foo = new DerefClass();
|
DerefClass *foo = new DerefClass();
|
||||||
delete foo;
|
delete foo;
|
||||||
delete foo; // newdelete-warning {{Attempt to free released memory}}
|
delete foo; // newdelete-warning {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
class EmptyClass{
|
class EmptyClass{
|
||||||
@ -424,7 +424,7 @@ public:
|
|||||||
void testDoubleDeleteEmptyClass() {
|
void testDoubleDeleteEmptyClass() {
|
||||||
EmptyClass *foo = new EmptyClass();
|
EmptyClass *foo = new EmptyClass();
|
||||||
delete foo;
|
delete foo;
|
||||||
delete foo; // newdelete-warning {{Attempt to free released memory}}
|
delete foo; // newdelete-warning {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Base {
|
struct Base {
|
||||||
|
@ -78,11 +78,11 @@ void testObjcFreeNewed() {
|
|||||||
void testFreeAfterDelete() {
|
void testFreeAfterDelete() {
|
||||||
int *p = new int;
|
int *p = new int;
|
||||||
delete p;
|
delete p;
|
||||||
free(p); // newdelete-warning{{Use of memory after it is freed}}
|
free(p); // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testStandardPlacementNewAfterDelete() {
|
void testStandardPlacementNewAfterDelete() {
|
||||||
int *p = new int;
|
int *p = new int;
|
||||||
delete p;
|
delete p;
|
||||||
p = new (p) int; // newdelete-warning{{Use of memory after it is freed}}
|
p = new (p) int; // newdelete-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
@ -16,8 +16,8 @@ void test() {
|
|||||||
delete p;
|
delete p;
|
||||||
// expected-note@-1 {{Memory is released}}
|
// expected-note@-1 {{Memory is released}}
|
||||||
|
|
||||||
delete p; // expected-warning {{Attempt to free released memory}}
|
delete p; // expected-warning {{Attempt to release already released memory}}
|
||||||
// expected-note@-1 {{Attempt to free released memory}}
|
// expected-note@-1 {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Odd {
|
struct Odd {
|
||||||
@ -29,7 +29,7 @@ struct Odd {
|
|||||||
void test(Odd *odd) {
|
void test(Odd *odd) {
|
||||||
odd->kill(); // expected-note{{Calling 'Odd::kill'}}
|
odd->kill(); // expected-note{{Calling 'Odd::kill'}}
|
||||||
// expected-note@-1 {{Returning; memory was released}}
|
// expected-note@-1 {{Returning; memory was released}}
|
||||||
delete odd; // expected-warning {{Attempt to free released memory}}
|
delete odd; // expected-warning {{Attempt to release already released memory}}
|
||||||
// expected-note@-1 {{Attempt to free released memory}}
|
// expected-note@-1 {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -19,8 +19,8 @@ struct smart_ptr {
|
|||||||
return (x || 0) ? nullptr : s; // expected-note{{Field 'x' is 0}}
|
return (x || 0) ? nullptr : s; // expected-note{{Field 'x' is 0}}
|
||||||
// expected-note@-1{{Left side of '||' is false}}
|
// expected-note@-1{{Left side of '||' is false}}
|
||||||
// expected-note@-2{{'?' condition is false}}
|
// expected-note@-2{{'?' condition is false}}
|
||||||
// expected-warning@-3{{Use of memory after it is freed}}
|
// expected-warning@-3{{Use of memory after it is released}}
|
||||||
// expected-note@-4{{Use of memory after it is freed}}
|
// expected-note@-4{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -35,7 +35,7 @@ void testSmartPointer() {
|
|||||||
SmartPointer Deleter(mem);
|
SmartPointer Deleter(mem);
|
||||||
// destructor called here
|
// destructor called here
|
||||||
}
|
}
|
||||||
*mem = 0; // expected-warning{{Use of memory after it is freed}}
|
*mem = 0; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -48,7 +48,7 @@ void testSmartPointer2() {
|
|||||||
doSomething();
|
doSomething();
|
||||||
// destructor called here
|
// destructor called here
|
||||||
}
|
}
|
||||||
*mem = 0; // expected-warning{{Use of memory after it is freed}}
|
*mem = 0; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -65,7 +65,7 @@ void testSubclassSmartPointer() {
|
|||||||
doSomething();
|
doSomething();
|
||||||
// destructor called here
|
// destructor called here
|
||||||
}
|
}
|
||||||
*mem = 0; // expected-warning{{Use of memory after it is freed}}
|
*mem = 0; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -82,7 +82,7 @@ void testMultipleInheritance1() {
|
|||||||
doSomething();
|
doSomething();
|
||||||
// destructor called here
|
// destructor called here
|
||||||
}
|
}
|
||||||
*mem = 0; // expected-warning{{Use of memory after it is freed}}
|
*mem = 0; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMultipleInheritance2() {
|
void testMultipleInheritance2() {
|
||||||
@ -93,7 +93,7 @@ void testMultipleInheritance2() {
|
|||||||
doSomething();
|
doSomething();
|
||||||
// destructor called here
|
// destructor called here
|
||||||
}
|
}
|
||||||
*mem = 0; // expected-warning{{Use of memory after it is freed}}
|
*mem = 0; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMultipleInheritance3() {
|
void testMultipleInheritance3() {
|
||||||
@ -103,7 +103,7 @@ void testMultipleInheritance3() {
|
|||||||
// Remove dead bindings...
|
// Remove dead bindings...
|
||||||
doSomething();
|
doSomething();
|
||||||
// destructor called here
|
// destructor called here
|
||||||
// expected-warning@28 {{Attempt to free released memory}}
|
// expected-warning@28 {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -122,7 +122,7 @@ void testSmartPointerMember() {
|
|||||||
doSomething();
|
doSomething();
|
||||||
// destructor called here
|
// destructor called here
|
||||||
}
|
}
|
||||||
*mem = 0; // expected-warning{{Use of memory after it is freed}}
|
*mem = 0; // expected-warning{{Use of memory after it is release}}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -524,7 +524,7 @@ struct NonTrivial {
|
|||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
~NonTrivial() {
|
~NonTrivial() {
|
||||||
delete[] p; // expected-warning {{free released memory}}
|
delete[] p; // expected-warning {{release already released memory}}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -593,5 +593,5 @@ void overrideLeak() {
|
|||||||
void overrideDoubleDelete() {
|
void overrideDoubleDelete() {
|
||||||
auto *a = new CustomOperators();
|
auto *a = new CustomOperators();
|
||||||
delete a;
|
delete a;
|
||||||
delete a; // expected-warning@577 {{Attempt to free released memory}}
|
delete a; // expected-warning@577 {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,7 @@ void test_getline_malloc_buffer() {
|
|||||||
|
|
||||||
ssize_t r = getdelim(&buffer, &n, '\r', F1);
|
ssize_t r = getdelim(&buffer, &n, '\r', F1);
|
||||||
// ptr may be dangling
|
// ptr may be dangling
|
||||||
free(ptr); // expected-warning {{Attempt to free released memory}}
|
free(ptr); // expected-warning {{Attempt to release already released memory}}
|
||||||
free(buffer); // ok
|
free(buffer); // ok
|
||||||
fclose(F1);
|
fclose(F1);
|
||||||
}
|
}
|
||||||
|
@ -41,7 +41,7 @@ void f1(void) {
|
|||||||
|
|
||||||
g_free(g1);
|
g_free(g1);
|
||||||
g_free(g2);
|
g_free(g2);
|
||||||
g_free(g2); // expected-warning{{Attempt to free released memory}}
|
g_free(g2); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f2(void) {
|
void f2(void) {
|
||||||
@ -61,7 +61,7 @@ void f2(void) {
|
|||||||
g_free(g1);
|
g_free(g1);
|
||||||
g_free(g2);
|
g_free(g2);
|
||||||
g_free(g3);
|
g_free(g3);
|
||||||
g3 = g_memdup(g3, n_bytes); // expected-warning{{Use of memory after it is freed}}
|
g3 = g_memdup(g3, n_bytes); // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f3(void) {
|
void f3(void) {
|
||||||
|
@ -45,13 +45,13 @@ void f1(void) {
|
|||||||
void f2(void) {
|
void f2(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
free(p); // expected-warning{{Attempt to free released memory}}
|
free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f2_realloc_0(void) {
|
void f2_realloc_0(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
realloc(p,0);
|
realloc(p,0);
|
||||||
realloc(p,0); // expected-warning{{Attempt to free released memory}}
|
realloc(p,0); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f2_realloc_1(void) {
|
void f2_realloc_1(void) {
|
||||||
@ -106,25 +106,25 @@ void af1_g(struct stuff **pps) {
|
|||||||
void af2(void) {
|
void af2(void) {
|
||||||
int *p = my_malloc(12);
|
int *p = my_malloc(12);
|
||||||
my_free(p);
|
my_free(p);
|
||||||
free(p); // expected-warning{{Attempt to free released memory}}
|
free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void af2b(void) {
|
void af2b(void) {
|
||||||
int *p = my_malloc(12);
|
int *p = my_malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
my_free(p); // expected-warning{{Attempt to free released memory}}
|
my_free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void af2c(void) {
|
void af2c(void) {
|
||||||
int *p = my_malloc(12);
|
int *p = my_malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
my_hold(p); // expected-warning{{Attempt to free released memory}}
|
my_hold(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void af2d(void) {
|
void af2d(void) {
|
||||||
int *p = my_malloc(12);
|
int *p = my_malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
my_hold2(0, 0, p); // expected-warning{{Attempt to free released memory}}
|
my_hold2(0, 0, p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// No leak if malloc returns null.
|
// No leak if malloc returns null.
|
||||||
@ -139,13 +139,13 @@ void af2e(void) {
|
|||||||
void af3(void) {
|
void af3(void) {
|
||||||
int *p = my_malloc(12);
|
int *p = my_malloc(12);
|
||||||
my_hold(p);
|
my_hold(p);
|
||||||
free(p); // expected-warning{{Attempt to free non-owned memory}}
|
free(p); // expected-warning{{Attempt to release non-owned memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
int * af4(void) {
|
int * af4(void) {
|
||||||
int *p = my_malloc(12);
|
int *p = my_malloc(12);
|
||||||
my_free(p);
|
my_free(p);
|
||||||
return p; // expected-warning{{Use of memory after it is freed}}
|
return p; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This case is (possibly) ok, be conservative
|
// This case is (possibly) ok, be conservative
|
||||||
@ -211,13 +211,13 @@ void pr6293(void) {
|
|||||||
void f7(void) {
|
void f7(void) {
|
||||||
char *x = (char*) malloc(4);
|
char *x = (char*) malloc(4);
|
||||||
free(x);
|
free(x);
|
||||||
x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
|
x[0] = 'a'; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f7_realloc(void) {
|
void f7_realloc(void) {
|
||||||
char *x = (char*) malloc(4);
|
char *x = (char*) malloc(4);
|
||||||
realloc(x,0);
|
realloc(x,0);
|
||||||
x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
|
x[0] = 'a'; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PR6123(void) {
|
void PR6123(void) {
|
||||||
|
@ -54,19 +54,19 @@ void af1_g(MemoryAllocator &Alloc, struct stuff **pps) {
|
|||||||
void af2(MemoryAllocator &Alloc) {
|
void af2(MemoryAllocator &Alloc) {
|
||||||
void *p = Alloc.my_malloc(12);
|
void *p = Alloc.my_malloc(12);
|
||||||
Alloc.my_free(p);
|
Alloc.my_free(p);
|
||||||
free(p); // expected-warning{{Attempt to free released memory}}
|
free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void af2b(MemoryAllocator &Alloc) {
|
void af2b(MemoryAllocator &Alloc) {
|
||||||
void *p = Alloc.my_malloc(12);
|
void *p = Alloc.my_malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
Alloc.my_free(p); // expected-warning{{Attempt to free released memory}}
|
Alloc.my_free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void af2c(MemoryAllocator &Alloc) {
|
void af2c(MemoryAllocator &Alloc) {
|
||||||
void *p = Alloc.my_malloc(12);
|
void *p = Alloc.my_malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
Alloc.my_hold(p); // expected-warning{{Attempt to free released memory}}
|
Alloc.my_hold(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// No leak if malloc returns null.
|
// No leak if malloc returns null.
|
||||||
@ -81,13 +81,13 @@ void af2e(MemoryAllocator &Alloc) {
|
|||||||
void af3(MemoryAllocator &Alloc) {
|
void af3(MemoryAllocator &Alloc) {
|
||||||
void *p = Alloc.my_malloc(12);
|
void *p = Alloc.my_malloc(12);
|
||||||
Alloc.my_hold(p);
|
Alloc.my_hold(p);
|
||||||
free(p); // expected-warning{{Attempt to free non-owned memory}}
|
free(p); // expected-warning{{Attempt to release non-owned memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void * af4(MemoryAllocator &Alloc) {
|
void * af4(MemoryAllocator &Alloc) {
|
||||||
void *p = Alloc.my_malloc(12);
|
void *p = Alloc.my_malloc(12);
|
||||||
Alloc.my_free(p);
|
Alloc.my_free(p);
|
||||||
return p; // expected-warning{{Use of memory after it is freed}}
|
return p; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// This case is (possibly) ok, be conservative
|
// This case is (possibly) ok, be conservative
|
||||||
|
@ -12,10 +12,10 @@ private:
|
|||||||
};
|
};
|
||||||
|
|
||||||
int *freeAfterReturnTemp() {
|
int *freeAfterReturnTemp() {
|
||||||
return S().getData(); // expected-warning {{Use of memory after it is freed}}
|
return S().getData(); // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
int *freeAfterReturnLocal() {
|
int *freeAfterReturnLocal() {
|
||||||
S X;
|
S X;
|
||||||
return X.getData(); // expected-warning {{Use of memory after it is freed}}
|
return X.getData(); // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
@ -59,13 +59,13 @@ int test4(void) {
|
|||||||
my_free1(data);
|
my_free1(data);
|
||||||
data = (int *)my_malloc2(1, 4);
|
data = (int *)my_malloc2(1, 4);
|
||||||
my_free1(data);
|
my_free1(data);
|
||||||
return *data; // expected-warning {{Use of memory after it is freed}}
|
return *data; // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test6(void) {
|
void test6(void) {
|
||||||
int *data = (int *)my_malloc2(1, 4);
|
int *data = (int *)my_malloc2(1, 4);
|
||||||
my_free1((int*)data);
|
my_free1((int*)data);
|
||||||
my_free1((int*)data); // expected-warning{{Use of memory after it is freed}}
|
my_free1((int*)data); // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: We should warn here.
|
// TODO: We should warn here.
|
||||||
@ -96,5 +96,5 @@ int uafAndCallsFooWithEmptyReturn(void) {
|
|||||||
int *x = (int*)malloc(12);
|
int *x = (int*)malloc(12);
|
||||||
free(x);
|
free(x);
|
||||||
fooWithEmptyReturn(12);
|
fooWithEmptyReturn(12);
|
||||||
return *x; // expected-warning {{Use of memory after it is freed}}
|
return *x; // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,7 @@ void test_wrapper(void) {
|
|||||||
(void) buf;
|
(void) buf;
|
||||||
}//expected-warning{{Potential leak}}
|
}//expected-warning{{Potential leak}}
|
||||||
|
|
||||||
// Test what happens when the same call frees and allocated memory.
|
// Test what happens when the same call releases and allocated memory.
|
||||||
// Also tests the stack hint for parameters, when they are passed directly or via pointer.
|
// Also tests the stack hint for parameters, when they are passed directly or via pointer.
|
||||||
void my_free(void *x) {
|
void my_free(void *x) {
|
||||||
free(x);
|
free(x);
|
||||||
@ -60,7 +60,7 @@ void my_malloc_and_free(void **x) {
|
|||||||
void *test_double_action_call(void) {
|
void *test_double_action_call(void) {
|
||||||
void *buf;
|
void *buf;
|
||||||
my_malloc_and_free(&buf);
|
my_malloc_and_free(&buf);
|
||||||
return buf; //expected-warning{{Use of memory after it is freed}}
|
return buf; //expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test stack hint for 'reallocation failed'.
|
// Test stack hint for 'reallocation failed'.
|
||||||
@ -98,7 +98,7 @@ void call_myfree_takingblock(void) {
|
|||||||
|
|
||||||
int *p = malloc(sizeof(int));
|
int *p = malloc(sizeof(int));
|
||||||
myfree_takingblock(some_block, p);
|
myfree_takingblock(some_block, p);
|
||||||
*p = 3;//expected-warning{{Use of memory after it is freed}}
|
*p = 3;//expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test that we refer to the last symbol used in the leak diagnostic.
|
// Test that we refer to the last symbol used in the leak diagnostic.
|
||||||
|
@ -69,12 +69,12 @@ void test_uaf(void)
|
|||||||
{
|
{
|
||||||
struct SomeData *data = alloc_data();
|
struct SomeData *data = alloc_data();
|
||||||
put_data_uncond(data);
|
put_data_uncond(data);
|
||||||
data->i += 1; // expected-warning{{Use of memory after it is freed}}
|
data->i += 1; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_no_uaf_atomic_after(void)
|
void test_no_uaf_atomic_after(void)
|
||||||
{
|
{
|
||||||
struct SomeData *data = alloc_data();
|
struct SomeData *data = alloc_data();
|
||||||
put_data_unrelated_atomic(data);
|
put_data_unrelated_atomic(data);
|
||||||
data->i += 1; // expected-warning{{Use of memory after it is freed}}
|
data->i += 1; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
@ -97,13 +97,13 @@ void f1(void) {
|
|||||||
void f2(void) {
|
void f2(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
free(p); // expected-warning{{Attempt to free released memory}}
|
free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f2_realloc_0(void) {
|
void f2_realloc_0(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
realloc(p,0);
|
realloc(p,0);
|
||||||
realloc(p,0); // expected-warning{{Attempt to free released memory}}
|
realloc(p,0); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f2_realloc_1(void) {
|
void f2_realloc_1(void) {
|
||||||
@ -153,7 +153,7 @@ void reallocSizeZero1(void) {
|
|||||||
char *p = malloc(12);
|
char *p = malloc(12);
|
||||||
char *r = realloc(p, 0);
|
char *r = realloc(p, 0);
|
||||||
if (!r) {
|
if (!r) {
|
||||||
free(p); // expected-warning {{Attempt to free released memory}}
|
free(p); // expected-warning {{Attempt to release already released memory}}
|
||||||
} else {
|
} else {
|
||||||
free(r);
|
free(r);
|
||||||
}
|
}
|
||||||
@ -163,11 +163,11 @@ void reallocSizeZero2(void) {
|
|||||||
char *p = malloc(12);
|
char *p = malloc(12);
|
||||||
char *r = realloc(p, 0);
|
char *r = realloc(p, 0);
|
||||||
if (!r) {
|
if (!r) {
|
||||||
free(p); // expected-warning {{Attempt to free released memory}}
|
free(p); // expected-warning {{Attempt to release already released memory}}
|
||||||
} else {
|
} else {
|
||||||
free(r);
|
free(r);
|
||||||
}
|
}
|
||||||
free(p); // expected-warning {{Attempt to free released memory}}
|
free(p); // expected-warning {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void reallocSizeZero3(void) {
|
void reallocSizeZero3(void) {
|
||||||
@ -262,7 +262,7 @@ void reallocfRadar6337483_3(void) {
|
|||||||
char * tmp;
|
char * tmp;
|
||||||
tmp = (char*)reallocf(buf, 0x1000000);
|
tmp = (char*)reallocf(buf, 0x1000000);
|
||||||
if (!tmp) {
|
if (!tmp) {
|
||||||
free(buf); // expected-warning {{Attempt to free released memory}}
|
free(buf); // expected-warning {{Attempt to release already released memory}}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
buf = tmp;
|
buf = tmp;
|
||||||
@ -480,19 +480,19 @@ void pr6293(void) {
|
|||||||
void f7(void) {
|
void f7(void) {
|
||||||
char *x = (char*) malloc(4);
|
char *x = (char*) malloc(4);
|
||||||
free(x);
|
free(x);
|
||||||
x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
|
x[0] = 'a'; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f8(void) {
|
void f8(void) {
|
||||||
char *x = (char*) malloc(4);
|
char *x = (char*) malloc(4);
|
||||||
free(x);
|
free(x);
|
||||||
char *y = strndup(x, 4); // expected-warning{{Use of memory after it is freed}}
|
char *y = strndup(x, 4); // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void f7_realloc(void) {
|
void f7_realloc(void) {
|
||||||
char *x = (char*) malloc(4);
|
char *x = (char*) malloc(4);
|
||||||
realloc(x,0);
|
realloc(x,0);
|
||||||
x[0] = 'a'; // expected-warning{{Use of memory after it is freed}}
|
x[0] = 'a'; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void PR6123(void) {
|
void PR6123(void) {
|
||||||
@ -773,7 +773,7 @@ void nullFree(void) {
|
|||||||
void paramFree(int *p) {
|
void paramFree(int *p) {
|
||||||
myfoo(p);
|
myfoo(p);
|
||||||
free(p); // no warning
|
free(p); // no warning
|
||||||
myfoo(p); // expected-warning {{Use of memory after it is freed}}
|
myfoo(p); // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void allocaFree(void) {
|
void allocaFree(void) {
|
||||||
@ -813,14 +813,14 @@ void mallocEscapeFreeFree(void) {
|
|||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
myfoo(p);
|
myfoo(p);
|
||||||
free(p);
|
free(p);
|
||||||
free(p); // expected-warning{{Attempt to free released memory}}
|
free(p); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mallocEscapeFreeUse(void) {
|
void mallocEscapeFreeUse(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
myfoo(p);
|
myfoo(p);
|
||||||
free(p);
|
free(p);
|
||||||
myfoo(p); // expected-warning{{Use of memory after it is freed}}
|
myfoo(p); // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
int *myalloc(void);
|
int *myalloc(void);
|
||||||
@ -846,7 +846,7 @@ void mallocBindFreeUse(void) {
|
|||||||
int *x = malloc(12);
|
int *x = malloc(12);
|
||||||
int *y = x;
|
int *y = x;
|
||||||
free(y);
|
free(y);
|
||||||
myfoo(x); // expected-warning{{Use of memory after it is freed}}
|
myfoo(x); // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mallocEscapeMalloc(void) {
|
void mallocEscapeMalloc(void) {
|
||||||
@ -871,13 +871,13 @@ void mallocFreeMalloc(void) {
|
|||||||
void mallocFreeUse_params(void) {
|
void mallocFreeUse_params(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
myfoo(p); //expected-warning{{Use of memory after it is freed}}
|
myfoo(p); //expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mallocFreeUse_params2(void) {
|
void mallocFreeUse_params2(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
myfooint(*p); //expected-warning{{Use of memory after it is freed}}
|
myfooint(*p); //expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void mallocFailedOrNot(void) {
|
void mallocFailedOrNot(void) {
|
||||||
@ -895,14 +895,14 @@ struct StructWithInt {
|
|||||||
int *mallocReturnFreed(void) {
|
int *mallocReturnFreed(void) {
|
||||||
int *p = malloc(12);
|
int *p = malloc(12);
|
||||||
free(p);
|
free(p);
|
||||||
return p; // expected-warning {{Use of memory after it is freed}}
|
return p; // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
int useAfterFreeStruct(void) {
|
int useAfterFreeStruct(void) {
|
||||||
struct StructWithInt *px= malloc(sizeof(struct StructWithInt));
|
struct StructWithInt *px= malloc(sizeof(struct StructWithInt));
|
||||||
px->g = 5;
|
px->g = 5;
|
||||||
free(px);
|
free(px);
|
||||||
return px->g; // expected-warning {{Use of memory after it is freed}}
|
return px->g; // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void nonSymbolAsFirstArg(int *pp, struct StructWithInt *p);
|
void nonSymbolAsFirstArg(int *pp, struct StructWithInt *p);
|
||||||
@ -935,7 +935,7 @@ void vallocEscapeFreeUse(void) {
|
|||||||
int *p = valloc(12);
|
int *p = valloc(12);
|
||||||
myfoo(p);
|
myfoo(p);
|
||||||
free(p);
|
free(p);
|
||||||
myfoo(p); // expected-warning{{Use of memory after it is freed}}
|
myfoo(p); // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
int *Gl;
|
int *Gl;
|
||||||
@ -1543,7 +1543,7 @@ void freeButNoMalloc(int *p, int x){
|
|||||||
free(p);
|
free(p);
|
||||||
//user forgot a return here.
|
//user forgot a return here.
|
||||||
}
|
}
|
||||||
free(p); // expected-warning {{Attempt to free released memory}}
|
free(p); // expected-warning {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
struct HasPtr {
|
struct HasPtr {
|
||||||
@ -1553,7 +1553,7 @@ struct HasPtr {
|
|||||||
char* reallocButNoMalloc(struct HasPtr *a, int c, int size) {
|
char* reallocButNoMalloc(struct HasPtr *a, int c, int size) {
|
||||||
int *s;
|
int *s;
|
||||||
char *b = realloc(a->p, size);
|
char *b = realloc(a->p, size);
|
||||||
char *m = realloc(a->p, size); // expected-warning {{Attempt to free released memory}}
|
char *m = realloc(a->p, size); // expected-warning {{Attempt to release already released memory}}
|
||||||
// We don't expect a use-after-free for a->P here because the warning above
|
// We don't expect a use-after-free for a->P here because the warning above
|
||||||
// is a sink.
|
// is a sink.
|
||||||
return a->p; // no-warning
|
return a->p; // no-warning
|
||||||
@ -1722,7 +1722,7 @@ void testOffsetZeroDoubleFree(void) {
|
|||||||
int *array = malloc(sizeof(int)*2);
|
int *array = malloc(sizeof(int)*2);
|
||||||
int *p = &array[0];
|
int *p = &array[0];
|
||||||
free(p);
|
free(p);
|
||||||
free(&array[0]); // expected-warning{{Attempt to free released memory}}
|
free(&array[0]); // expected-warning{{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testOffsetPassedToStrlen(void) {
|
void testOffsetPassedToStrlen(void) {
|
||||||
@ -1835,7 +1835,7 @@ int testNoCheckerDataPropagationFromLogicalOpOperandToOpResult(void) {
|
|||||||
int ok = (param && value);
|
int ok = (param && value);
|
||||||
free(param);
|
free(param);
|
||||||
free(value);
|
free(value);
|
||||||
// Previously we ended up with 'Use of memory after it is freed' on return.
|
// Previously we ended up with 'Use of memory after it is released' on return.
|
||||||
return ok; // no warning
|
return ok; // no warning
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1970,7 +1970,7 @@ void gh149754(void *p) {
|
|||||||
// was since then removed for the codebase.
|
// was since then removed for the codebase.
|
||||||
if (!realloc(p, 8)) {
|
if (!realloc(p, 8)) {
|
||||||
realloc(p, 8);
|
realloc(p, 8);
|
||||||
free(p); // expected-warning {{Attempt to free released memory}}
|
free(p); // expected-warning {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
// expected-warning@+1 {{Potential memory leak}}
|
// expected-warning@+1 {{Potential memory leak}}
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ void testNSStringFreeWhenDoneYES3(NSUInteger dataLength) {
|
|||||||
void testNSStringFreeWhenDoneYES4(NSUInteger dataLength) {
|
void testNSStringFreeWhenDoneYES4(NSUInteger dataLength) {
|
||||||
unichar *data = (unichar*)malloc(42);
|
unichar *data = (unichar*)malloc(42);
|
||||||
NSString *nsstr = [[NSString alloc] initWithCharactersNoCopy:data length:dataLength freeWhenDone:1];
|
NSString *nsstr = [[NSString alloc] initWithCharactersNoCopy:data length:dataLength freeWhenDone:1];
|
||||||
free(data); //expected-warning {{Attempt to free non-owned memory}}
|
free(data); //expected-warning {{Attempt to release non-owned memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testNSStringFreeWhenDoneYES(NSUInteger dataLength) {
|
void testNSStringFreeWhenDoneYES(NSUInteger dataLength) {
|
||||||
@ -95,14 +95,14 @@ void testOffsetFree() {
|
|||||||
void testRelinquished1() {
|
void testRelinquished1() {
|
||||||
void *data = malloc(42);
|
void *data = malloc(42);
|
||||||
NSData *nsdata = [NSData dataWithBytesNoCopy:data length:42 freeWhenDone:1];
|
NSData *nsdata = [NSData dataWithBytesNoCopy:data length:42 freeWhenDone:1];
|
||||||
free(data); // expected-warning {{Attempt to free non-owned memory}}
|
free(data); // expected-warning {{Attempt to release non-owned memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testRelinquished2() {
|
void testRelinquished2() {
|
||||||
void *data = malloc(42);
|
void *data = malloc(42);
|
||||||
NSData *nsdata;
|
NSData *nsdata;
|
||||||
free(data);
|
free(data);
|
||||||
[NSData dataWithBytesNoCopy:data length:42]; // expected-warning {{Use of memory after it is freed}}
|
[NSData dataWithBytesNoCopy:data length:42]; // expected-warning {{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
@interface My
|
@interface My
|
||||||
@ -112,7 +112,7 @@ void testRelinquished2() {
|
|||||||
void testUseAfterFree() {
|
void testUseAfterFree() {
|
||||||
int *p = (int *)malloc(sizeof(int));
|
int *p = (int *)malloc(sizeof(int));
|
||||||
free(p);
|
free(p);
|
||||||
[My param:p]; // expected-warning{{Use of memory after it is freed}}
|
[My param:p]; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testNoCopy() {
|
void testNoCopy() {
|
||||||
@ -318,7 +318,7 @@ NSString *test12365078_no_malloc_returnValue(unichar *characters) {
|
|||||||
|
|
||||||
void test12365078_nocheck_nomalloc(unichar *characters) {
|
void test12365078_nocheck_nomalloc(unichar *characters) {
|
||||||
NSString *string = [[NSString alloc] initWithCharactersNoCopy:characters length:12 freeWhenDone:1];
|
NSString *string = [[NSString alloc] initWithCharactersNoCopy:characters length:12 freeWhenDone:1];
|
||||||
free(characters); // expected-warning {{Attempt to free non-owned memory}}
|
free(characters); // expected-warning {{Attempt to release non-owned memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test12365078_nested(unichar *characters) {
|
void test12365078_nested(unichar *characters) {
|
||||||
@ -339,7 +339,7 @@ void test12365078_nested(unichar *characters) {
|
|||||||
void test12365078_check_positive() {
|
void test12365078_check_positive() {
|
||||||
unichar *characters = (unichar*)malloc(12);
|
unichar *characters = (unichar*)malloc(12);
|
||||||
NSString *string = [[NSString alloc] initWithCharactersNoCopy:characters length:12 freeWhenDone:1];
|
NSString *string = [[NSString alloc] initWithCharactersNoCopy:characters length:12 freeWhenDone:1];
|
||||||
if (string) free(characters); // expected-warning{{Attempt to free non-owned memory}}
|
if (string) free(characters); // expected-warning{{Attempt to release non-owned memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void *test_reinterpret_cast_to_block() {
|
void *test_reinterpret_cast_to_block() {
|
||||||
|
@ -112,7 +112,7 @@ void testCacheOut(PtrWrapper w) {
|
|||||||
void testUseAfter(int *p) {
|
void testUseAfter(int *p) {
|
||||||
SomeClass *c = new SomeClass;
|
SomeClass *c = new SomeClass;
|
||||||
free(p);
|
free(p);
|
||||||
c->f(p); // expected-warning{{Use of memory after it is freed}}
|
c->f(p); // expected-warning{{Use of memory after it is released}}
|
||||||
delete c;
|
delete c;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -140,25 +140,25 @@ void testDeleteMallocked() {
|
|||||||
void testDeleteOpAfterFree() {
|
void testDeleteOpAfterFree() {
|
||||||
int *p = (int *)malloc(sizeof(int));
|
int *p = (int *)malloc(sizeof(int));
|
||||||
free(p);
|
free(p);
|
||||||
operator delete(p); // expected-warning{{Use of memory after it is freed}}
|
operator delete(p); // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testDeleteAfterFree() {
|
void testDeleteAfterFree() {
|
||||||
int *p = (int *)malloc(sizeof(int));
|
int *p = (int *)malloc(sizeof(int));
|
||||||
free(p);
|
free(p);
|
||||||
delete p; // expected-warning{{Use of memory after it is freed}}
|
delete p; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testStandardPlacementNewAfterFree() {
|
void testStandardPlacementNewAfterFree() {
|
||||||
int *p = (int *)malloc(sizeof(int));
|
int *p = (int *)malloc(sizeof(int));
|
||||||
free(p);
|
free(p);
|
||||||
p = new(p) int; // expected-warning{{Use of memory after it is freed}}
|
p = new(p) int; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testCustomPlacementNewAfterFree() {
|
void testCustomPlacementNewAfterFree() {
|
||||||
int *p = (int *)malloc(sizeof(int));
|
int *p = (int *)malloc(sizeof(int));
|
||||||
free(p);
|
free(p);
|
||||||
p = new(0, p) int; // expected-warning{{Use of memory after it is freed}}
|
p = new(0, p) int; // expected-warning{{Use of memory after it is released}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void testUsingThisAfterDelete() {
|
void testUsingThisAfterDelete() {
|
||||||
|
@ -33,5 +33,5 @@ void useAfterFree(__isl_take Object *A) {
|
|||||||
freeObj(B);
|
freeObj(B);
|
||||||
|
|
||||||
A->Ref = 13;
|
A->Ref = 13;
|
||||||
// no-warning: 'Use of memory after it is freed' was here.
|
// no-warning: 'Use of memory after it is released' was here.
|
||||||
}
|
}
|
||||||
|
@ -42,8 +42,8 @@ StringUsed &StringUsed::operator=(const StringUsed &rhs) {
|
|||||||
// expected-note@-2{{TRUE}}
|
// expected-note@-2{{TRUE}}
|
||||||
// expected-note@-3{{UNKNOWN}}
|
// expected-note@-3{{UNKNOWN}}
|
||||||
free(str); // expected-note{{Memory is released}}
|
free(str); // expected-note{{Memory is released}}
|
||||||
str = strdup(rhs.str); // expected-warning{{Use of memory after it is freed}}
|
str = strdup(rhs.str); // expected-warning{{Use of memory after it is released}}
|
||||||
// expected-note@-1{{Use of memory after it is freed}}
|
// expected-note@-1{{Use of memory after it is released}}
|
||||||
// expected-note@-2{{Memory is allocated}}
|
// expected-note@-2{{Memory is allocated}}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
@ -90,8 +90,8 @@ StringUnused &StringUnused::operator=(const StringUnused &rhs) {
|
|||||||
// expected-note@-2{{TRUE}}
|
// expected-note@-2{{TRUE}}
|
||||||
// expected-note@-3{{UNKNOWN}}
|
// expected-note@-3{{UNKNOWN}}
|
||||||
free(str); // expected-note{{Memory is released}}
|
free(str); // expected-note{{Memory is released}}
|
||||||
str = strdup(rhs.str); // expected-warning{{Use of memory after it is freed}}
|
str = strdup(rhs.str); // expected-warning{{Use of memory after it is released}}
|
||||||
// expected-note@-1{{Use of memory after it is freed}}
|
// expected-note@-1{{Use of memory after it is released}}
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -31,7 +31,7 @@ void test(Node *N) {
|
|||||||
delete N;
|
delete N;
|
||||||
|
|
||||||
N = Next.getPointer();
|
N = Next.getPointer();
|
||||||
// no-warning: 'Use of memory after it is freed' was here as the same
|
// no-warning: 'Use of memory after it is released' was here as the same
|
||||||
// 'StackArgumentsSpaceRegion' purged out twice as 'P'.
|
// 'StackArgumentsSpaceRegion' purged out twice as 'P'.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -57,8 +57,8 @@ void ctor_notetag_on_constraining_symbol(const char *p) {
|
|||||||
|
|
||||||
free((void *)p); // expected-note {{Memory is released}}
|
free((void *)p); // expected-note {{Memory is released}}
|
||||||
free((void *)p);
|
free((void *)p);
|
||||||
// expected-warning@-1 {{Attempt to free released memory}}
|
// expected-warning@-1 {{Attempt to release already released memory}}
|
||||||
// expected-note@-2 {{Attempt to free released memory}}
|
// expected-note@-2 {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctor_no_notetag_symbol_already_constrained(const char *p) {
|
void ctor_no_notetag_symbol_already_constrained(const char *p) {
|
||||||
@ -73,8 +73,8 @@ void ctor_no_notetag_symbol_already_constrained(const char *p) {
|
|||||||
|
|
||||||
free((void *)p); // expected-note {{Memory is released}}
|
free((void *)p); // expected-note {{Memory is released}}
|
||||||
free((void *)p);
|
free((void *)p);
|
||||||
// expected-warning@-1 {{Attempt to free released memory}}
|
// expected-warning@-1 {{Attempt to release already released memory}}
|
||||||
// expected-note@-2 {{Attempt to free released memory}}
|
// expected-note@-2 {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctor_no_notetag_if_not_interesting(const char *p1, const char *p2) {
|
void ctor_no_notetag_if_not_interesting(const char *p1, const char *p2) {
|
||||||
@ -83,6 +83,6 @@ void ctor_no_notetag_if_not_interesting(const char *p1, const char *p2) {
|
|||||||
|
|
||||||
free((void *)p1); // expected-note {{Memory is released}}
|
free((void *)p1); // expected-note {{Memory is released}}
|
||||||
free((void *)p1);
|
free((void *)p1);
|
||||||
// expected-warning@-1 {{Attempt to free released memory}}
|
// expected-warning@-1 {{Attempt to release already released memory}}
|
||||||
// expected-note@-2 {{Attempt to free released memory}}
|
// expected-note@-2 {{Attempt to release already released memory}}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user