mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-15 04:00:56 +00:00
[analyzer] Implement pointer arithmetic on constants
Patch by: Rafael Stahl! Differential Revision: https://reviews.llvm.org/D37478 llvm-svn: 315296
This commit is contained in:
parent
29ffd3f1d9
commit
21524676a2
@ -922,6 +922,10 @@ SVal SimpleSValBuilder::evalBinOpLN(ProgramStateRef state,
|
||||
if (rhs.isZeroConstant())
|
||||
return lhs;
|
||||
|
||||
// Perserve the null pointer so that it can be found by the DerefChecker.
|
||||
if (lhs.isZeroConstant())
|
||||
return lhs;
|
||||
|
||||
// We are dealing with pointer arithmetic.
|
||||
|
||||
// Handle pointer arithmetic on constant values.
|
||||
@ -937,6 +941,8 @@ SVal SimpleSValBuilder::evalBinOpLN(ProgramStateRef state,
|
||||
|
||||
// Offset the increment by the pointer size.
|
||||
llvm::APSInt Multiplicand(rightI.getBitWidth(), /* isUnsigned */ true);
|
||||
QualType pointeeType = resultTy->getPointeeType();
|
||||
Multiplicand = getContext().getTypeSizeInChars(pointeeType).getQuantity();
|
||||
rightI *= Multiplicand;
|
||||
|
||||
// Compute the adjusted pointer.
|
||||
|
30
clang/test/Analysis/pointer-arithmetic.c
Normal file
30
clang/test/Analysis/pointer-arithmetic.c
Normal file
@ -0,0 +1,30 @@
|
||||
// RUN: %clang_analyze_cc1 -analyzer-checker=core -verify %s
|
||||
|
||||
int test1() {
|
||||
int *p = (int *)sizeof(int);
|
||||
p -= 1;
|
||||
return *p; // expected-warning {{Dereference of null pointer}}
|
||||
}
|
||||
|
||||
int test2() {
|
||||
int *p = (int *)sizeof(int);
|
||||
p -= 2;
|
||||
p += 1;
|
||||
return *p; // expected-warning {{Dereference of null pointer}}
|
||||
}
|
||||
|
||||
int test3() {
|
||||
int *p = (int *)sizeof(int);
|
||||
p++;
|
||||
p--;
|
||||
p--;
|
||||
return *p; // expected-warning {{Dereference of null pointer}}
|
||||
}
|
||||
|
||||
int test4() {
|
||||
// This is a special case where pointer arithmetic is not calculated to
|
||||
// preserve useful warnings on dereferences of null pointers.
|
||||
int *p = 0;
|
||||
p += 1;
|
||||
return *p; // expected-warning {{Dereference of null pointer}}
|
||||
}
|
Loading…
Reference in New Issue
Block a user