mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-03 19:32:35 +00:00
[analyzer] Don't crash running destructors for multidimensional arrays.
We don't handle array destructors correctly yet, but we now apply the same hack (explicitly destroy the first element, implicitly invalidate the rest) for multidimensional arrays that we already use for linear arrays. <rdar://problem/12858542> llvm-svn: 170000
This commit is contained in:
parent
a87ecb43ab
commit
4cfdbff3c7
@ -172,7 +172,8 @@ void ExprEngine::VisitCXXDestructor(QualType ObjectType,
|
||||
// FIXME: We need to run the same destructor on every element of the array.
|
||||
// This workaround will just run the first destructor (which will still
|
||||
// invalidate the entire array).
|
||||
if (const ArrayType *AT = getContext().getAsArrayType(ObjectType)) {
|
||||
// This is a loop because of multidimensional arrays.
|
||||
while (const ArrayType *AT = getContext().getAsArrayType(ObjectType)) {
|
||||
ObjectType = AT->getElementType();
|
||||
Dest = State->getLValue(ObjectType, getSValBuilder().makeZeroArrayIndex(),
|
||||
loc::MemRegionVal(Dest)).getAsRegion();
|
||||
|
@ -301,3 +301,30 @@ namespace ExplicitDestructorCall {
|
||||
obj->VirtualDtor::~VirtualDtor();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
namespace MultidimensionalArrays {
|
||||
void testArrayInvalidation() {
|
||||
int i = 42;
|
||||
int j = 42;
|
||||
|
||||
{
|
||||
IntWrapper arr[2][2];
|
||||
|
||||
// There should be no undefined value warnings here.
|
||||
// Eventually these should be TRUE as well, but right now
|
||||
// we can't handle array constructors.
|
||||
clang_analyzer_eval(arr[0][0].x == 0); // expected-warning{{UNKNOWN}}
|
||||
clang_analyzer_eval(arr[1][1].x == 0); // expected-warning{{UNKNOWN}}
|
||||
|
||||
arr[0][0].x = &i;
|
||||
arr[1][1].x = &j;
|
||||
clang_analyzer_eval(*arr[0][0].x == 42); // expected-warning{{TRUE}}
|
||||
clang_analyzer_eval(*arr[1][1].x == 42); // expected-warning{{TRUE}}
|
||||
}
|
||||
|
||||
// The destructors should have invalidated i and j.
|
||||
clang_analyzer_eval(i == 42); // expected-warning{{UNKNOWN}}
|
||||
clang_analyzer_eval(j == 42); // expected-warning{{UNKNOWN}}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user