|
Revision tags: llvmorg-20.1.0, llvmorg-20.1.0-rc3, llvmorg-20.1.0-rc2, llvmorg-20.1.0-rc1, llvmorg-21-init, llvmorg-19.1.7, llvmorg-19.1.6, llvmorg-19.1.5, llvmorg-19.1.4, llvmorg-19.1.3, llvmorg-19.1.2, llvmorg-19.1.1, llvmorg-19.1.0, llvmorg-19.1.0-rc4, llvmorg-19.1.0-rc3, llvmorg-19.1.0-rc2, llvmorg-19.1.0-rc1, llvmorg-20-init, llvmorg-18.1.8, llvmorg-18.1.7, llvmorg-18.1.6, llvmorg-18.1.5, llvmorg-18.1.4, llvmorg-18.1.3, llvmorg-18.1.2, llvmorg-18.1.1, llvmorg-18.1.0, llvmorg-18.1.0-rc4, llvmorg-18.1.0-rc3, llvmorg-18.1.0-rc2, llvmorg-18.1.0-rc1, llvmorg-19-init, llvmorg-17.0.6, llvmorg-17.0.5, llvmorg-17.0.4, llvmorg-17.0.3, llvmorg-17.0.2, llvmorg-17.0.1, llvmorg-17.0.0, llvmorg-17.0.0-rc4, llvmorg-17.0.0-rc3, llvmorg-17.0.0-rc2, llvmorg-17.0.0-rc1, llvmorg-18-init, llvmorg-16.0.6, llvmorg-16.0.5, llvmorg-16.0.4, llvmorg-16.0.3, llvmorg-16.0.2, llvmorg-16.0.1, llvmorg-16.0.0, llvmorg-16.0.0-rc4, llvmorg-16.0.0-rc3, llvmorg-16.0.0-rc2, llvmorg-16.0.0-rc1, llvmorg-17-init, llvmorg-15.0.7, llvmorg-15.0.6, llvmorg-15.0.5, llvmorg-15.0.4, llvmorg-15.0.3, llvmorg-15.0.2, llvmorg-15.0.1, llvmorg-15.0.0, llvmorg-15.0.0-rc3, llvmorg-15.0.0-rc2, llvmorg-15.0.0-rc1, llvmorg-16-init |
|
| #
a80418ee |
| 26-Jul-2022 |
Balazs Benics <[email protected]> |
[analyzer] Improve loads from reinterpret-cast fields
Consider this example:
```lang=C++ struct header { unsigned a : 1; unsigned b : 1; }; struct parse_t { unsigned bits0 : 1; unsigned bit
[analyzer] Improve loads from reinterpret-cast fields
Consider this example:
```lang=C++ struct header { unsigned a : 1; unsigned b : 1; }; struct parse_t { unsigned bits0 : 1; unsigned bits2 : 2; // <-- header unsigned bits4 : 4; }; int parse(parse_t *p) { unsigned copy = p->bits2; clang_analyzer_dump(copy); // expected-warning@-1 {{reg_$1<unsigned int SymRegion{reg_$0<struct Bug_55934::parse_t * p>}.bits2>}}
header *bits = (header *)© clang_analyzer_dump(bits->b); // <--- Was UndefinedVal previously. // expected-warning@-1 {{derived_$2{reg_$1<unsigned int SymRegion{reg_$0<struct Bug_55934::parse_t * p>}.bits2>,Element{copy,0 S64b,struct Bug_55934::header}.b}}} return bits->b; // no-warning: it's not UndefinedVal } ```
`bits->b` should have the same content as the second bit of `p->bits2` (assuming that the bitfields are in spelling order).
---
The `Store` has the correct bindings. The problem is with the load of `bits->b`. It will eventually reach `RegionStoreManager::getBindingForField()` with `Element{copy,0 S64b,struct header}.b`, which is a `FieldRegion`. It did not find any direct bindings, so the `getBindingForFieldOrElementCommon()` gets called. That won't find any bindings, but it sees that the variable is on the //stack//, thus it must be an uninitialized local variable; thus it returns `UndefinedVal`.
Instead of doing this, it should have created a //derived symbol// representing the slice of the region corresponding to the member. So, if the value of `copy` is `reg1`, then the value of `bits->b` should be `derived{reg1, elem{copy,0, header}.b}`.
Actually, the `getBindingForElement()` already does exactly this for reinterpret-casts, so I decided to hoist that and reuse the logic.
Fixes #55934
Reviewed By: martong
Differential Revision: https://reviews.llvm.org/D128535
show more ...
|
|
Revision tags: llvmorg-14.0.6 |
|
| #
ca4af13e |
| 21-Jun-2022 |
Kazu Hirata <[email protected]> |
[clang] Don't use Optional::getValue (NFC)
|
| #
0916d96d |
| 21-Jun-2022 |
Kazu Hirata <[email protected]> |
Don't use Optional::hasValue (NFC)
|
| #
452db157 |
| 20-Jun-2022 |
Kazu Hirata <[email protected]> |
[clang] Don't use Optional::hasValue (NFC)
|
| #
92bf652d |
| 17-Jun-2022 |
isuckatcs <[email protected]> |
[Static Analyzer] Small array binding policy
If a lazyCompoundVal to a struct is bound to the store, there is a policy which decides whether a copy gets created instead.
This patch introduces a sim
[Static Analyzer] Small array binding policy
If a lazyCompoundVal to a struct is bound to the store, there is a policy which decides whether a copy gets created instead.
This patch introduces a similar policy for arrays, which is required to model structured binding to arrays without false negatives.
Differential Revision: https://reviews.llvm.org/D128064
show more ...
|
| #
96ccb690 |
| 15-Jun-2022 |
Balazs Benics <[email protected]> |
[analyzer][NFC] Prefer using isa<> instead getAs<> in conditions
Depends on D125709
Reviewed By: martong
Differential Revision: https://reviews.llvm.org/D127742
|
|
Revision tags: llvmorg-14.0.5 |
|
| #
b73c2280 |
| 10-Jun-2022 |
Balazs Benics <[email protected]> |
[analyzer][NFC] Remove unused RegionStoreFeatures
Reviewed By: martong
Differential Revision: https://reviews.llvm.org/D126216
|
|
Revision tags: llvmorg-14.0.4, llvmorg-14.0.3, llvmorg-14.0.2 |
|
| #
df580180 |
| 24-Apr-2022 |
einvbri <[email protected]> |
[analyzer] Get direct binding for specific punned case
Region store was not able to see through this case to the actual initialized value of STRUCT ff. This change addresses this case by getting the
[analyzer] Get direct binding for specific punned case
Region store was not able to see through this case to the actual initialized value of STRUCT ff. This change addresses this case by getting the direct binding. This was found and debugged in a downstream compiler, with debug guidance from @steakhal. A positive and negative test case is added.
The specific case where this issue was exposed.
typedef struct { int a:1; int b[2]; } STRUCT;
int main() { STRUCT ff = {0}; STRUCT* pff = &ff; int a = ((int)pff + 1); return a; }
Reviewed By: steakhal, martong
Differential Revision: https://reviews.llvm.org/D124349
show more ...
|
| #
68ee5ec0 |
| 27-Apr-2022 |
Marco Antognini <[email protected]> |
[Analyzer] Fix assumptions about const field with member-initializer
Essentially, having a default member initializer for a constant member does not necessarily imply the member will have the given
[Analyzer] Fix assumptions about const field with member-initializer
Essentially, having a default member initializer for a constant member does not necessarily imply the member will have the given default value.
Remove part of a2e053638bbf ([analyzer] Treat more const variables and fields as known contants., 2018-05-04).
Fix #47878
Reviewed By: r.stahl, steakhal
Differential Revision: https://reviews.llvm.org/D124621
show more ...
|
|
Revision tags: llvmorg-14.0.1, llvmorg-14.0.0, llvmorg-14.0.0-rc4, llvmorg-14.0.0-rc3, llvmorg-14.0.0-rc2, llvmorg-14.0.0-rc1 |
|
| #
98588841 |
| 09-Feb-2022 |
Vince Bridgers <[email protected]> |
[analyzer] Refactor makeNull to makeNullWithWidth (NFC)
Usages of makeNull need to be deprecated in favor of makeNullWithWidth for architectures where the pointer size should not be assumed. This ca
[analyzer] Refactor makeNull to makeNullWithWidth (NFC)
Usages of makeNull need to be deprecated in favor of makeNullWithWidth for architectures where the pointer size should not be assumed. This can occur when pointer sizes can be of different sizes, depending on address space for example. See https://reviews.llvm.org/D118050 as an example.
This was uncovered initially in a downstream compiler project, and tested through those systems tests.
steakhal performed systems testing across a large set of open source projects.
Co-authored-by: steakhal Resolves: https://github.com/llvm/llvm-project/issues/53664
Reviewed By: NoQ, steakhal
Differential Revision: https://reviews.llvm.org/D119601
show more ...
|
| #
f2c2e924 |
| 08-Feb-2022 |
Sylvestre Ledru <[email protected]> |
Fix a typo (occured => occurred)
Reported: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1005195
|
|
Revision tags: llvmorg-15-init, llvmorg-13.0.1, llvmorg-13.0.1-rc3, llvmorg-13.0.1-rc2, llvmorg-13.0.1-rc1 |
|
| #
a12bfac2 |
| 22-Oct-2021 |
Denys Petrov <[email protected]> |
[analyzer] Retrieve a value from list initialization of multi-dimensional array declaration.
Summary: Add support of multi-dimensional arrays in `RegionStoreManager::getBindingForElement`. Handle ne
[analyzer] Retrieve a value from list initialization of multi-dimensional array declaration.
Summary: Add support of multi-dimensional arrays in `RegionStoreManager::getBindingForElement`. Handle nested ElementRegion's getting offsets and checking for being in bounds. Get values from the nested initialization lists using obtained offsets.
Differential Revision: https://reviews.llvm.org/D111654
show more ...
|
| #
1deccd05 |
| 20-Oct-2021 |
Denys Petrov <[email protected]> |
[analyzer] Retrieve a character from StringLiteral as an initializer for constant arrays.
Summary: Assuming that values of constant arrays never change, we can retrieve values for specific position(
[analyzer] Retrieve a character from StringLiteral as an initializer for constant arrays.
Summary: Assuming that values of constant arrays never change, we can retrieve values for specific position(index) right from the initializer, if presented. Retrieve a character code by index from StringLiteral which is an initializer of constant arrays in global scope.
This patch has a known issue of getting access to characters past the end of the literal. The declaration, in which the literal is used, is an implicit cast of kind `array-to-pointer`. The offset should be in literal length's bounds. This should be distinguished from the states in the Standard C++20 [dcl.init.string] 9.4.2.3. Example: const char arr[42] = "123"; char c = arr[41]; // OK const char * const str = "123"; char c = str[41]; // NOK
Differential Revision: https://reviews.llvm.org/D107339
show more ...
|
| #
3b1165ba |
| 20-Oct-2021 |
Denys Petrov <[email protected]> |
[analyzer] Retrieve incomplete array extent from its redeclaration.
Summary: Fix a case when the extent can not be retrieved correctly from incomplete array declaration. Use redeclaration to get the
[analyzer] Retrieve incomplete array extent from its redeclaration.
Summary: Fix a case when the extent can not be retrieved correctly from incomplete array declaration. Use redeclaration to get the array extent.
Differential Revision: https://reviews.llvm.org/D111542
show more ...
|
| #
44e803ef |
| 18-Oct-2021 |
Denys Petrov <[email protected]> |
[analyzer][NFCI] Move a block from `getBindingForElement` to separate functions
Summary: 1. Improve readability by moving deeply nested block of code from RegionStoreManager::getBindingForElement to
[analyzer][NFCI] Move a block from `getBindingForElement` to separate functions
Summary: 1. Improve readability by moving deeply nested block of code from RegionStoreManager::getBindingForElement to new separate functions: - getConstantValFromConstArrayInitializer; - getSValFromInitListExpr. 2. Handle the case when index is a symbolic value. Write specific test cases. 3. Add test cases when there is no initialization expression presented. This patch implies to make next patches clearer and easier for review process.
Differential Revision: https://reviews.llvm.org/D106681
show more ...
|
| #
16be17ad |
| 20-Oct-2021 |
Balazs Benics <[email protected]> |
[analyzer][NFC] Refactor llvm::isa<> usages in the StaticAnalyzer
It turns out llvm::isa<> is variadic, and we could have used this at a lot of places.
The following patterns: x && isa<T1>(x) ||
[analyzer][NFC] Refactor llvm::isa<> usages in the StaticAnalyzer
It turns out llvm::isa<> is variadic, and we could have used this at a lot of places.
The following patterns: x && isa<T1>(x) || isa<T2>(x) ... Will be replaced by: isa_and_non_null<T1, T2, ...>(x)
Sometimes it caused further simplifications, when it would cause even more code smell.
Aside from this, keep in mind that within `assert()` or any macro functions, we need to wrap the isa<> expression within a parenthesis, due to the parsing of the comma.
Reviewed By: martong
Differential Revision: https://reviews.llvm.org/D111982
show more ...
|
|
Revision tags: llvmorg-13.0.0, llvmorg-13.0.0-rc4 |
|
| #
98a95d48 |
| 21-Sep-2021 |
Denys Petrov <[email protected]> |
[analyzer] Retrieve a value from list initialization of constant array declaration in a global scope.
Summary: Fix the point that we didn't take into account array's dimension. Retrieve a value of g
[analyzer] Retrieve a value from list initialization of constant array declaration in a global scope.
Summary: Fix the point that we didn't take into account array's dimension. Retrieve a value of global constant array by iterating through its initializer list.
Differential Revision: https://reviews.llvm.org/D104285
Fixes: https://bugs.llvm.org/show_bug.cgi?id=50604
show more ...
|
|
Revision tags: llvmorg-13.0.0-rc3, llvmorg-13.0.0-rc2, llvmorg-13.0.0-rc1, llvmorg-14-init, llvmorg-12.0.1, llvmorg-12.0.1-rc4, llvmorg-12.0.1-rc3, llvmorg-12.0.1-rc2, llvmorg-12.0.1-rc1 |
|
| #
7736b08c |
| 13-Apr-2021 |
Denys Petrov <[email protected]> |
[analyzer] Replace StoreManager::CastRetrievedVal with SValBuilder::evalCast
Summary: Move logic from CastRetrievedVal to evalCast and replace CastRetrievedVal with evalCast. Also move guts from Sim
[analyzer] Replace StoreManager::CastRetrievedVal with SValBuilder::evalCast
Summary: Move logic from CastRetrievedVal to evalCast and replace CastRetrievedVal with evalCast. Also move guts from SimpleSValBuilder::dispatchCast inside evalCast. evalCast intends to substitute dispatchCast, evalCastFromNonLoc and evalCastFromLoc in the future. OriginalTy provides additional information for casting, which is useful for some cases and useless for others. If `OriginalTy.isNull()` is true, then cast performs based on CastTy only. Now evalCast operates in two ways. It retains all previous behavior and take over dispatchCast behavior. dispatchCast, evalCastFromNonLoc and evalCastFromLoc is considered as buggy since it doesn't take into account OriginalTy of the SVal and should be improved.
From this patch use evalCast instead of dispatchCast, evalCastFromNonLoc and evalCastFromLoc functions. dispatchCast redirects to evalCast.
This patch shall not change any behavior.
Differential Revision: https://reviews.llvm.org/D96090
show more ...
|
|
Revision tags: llvmorg-12.0.0, llvmorg-12.0.0-rc5 |
|
| #
9b3df78b |
| 05-Apr-2021 |
Charusso <[email protected]> |
[analyzer] DynamicSize: Rename 'size' to 'extent'
|
|
Revision tags: llvmorg-12.0.0-rc4, llvmorg-12.0.0-rc3, llvmorg-12.0.0-rc2, llvmorg-11.1.0, llvmorg-11.1.0-rc3, llvmorg-12.0.0-rc1, llvmorg-13-init, llvmorg-11.1.0-rc2, llvmorg-11.1.0-rc1, llvmorg-11.0.1, llvmorg-11.0.1-rc2, llvmorg-11.0.1-rc1, llvmorg-11.0.0, llvmorg-11.0.0-rc6, llvmorg-11.0.0-rc5, llvmorg-11.0.0-rc4, llvmorg-11.0.0-rc3, llvmorg-11.0.0-rc2, llvmorg-11.0.0-rc1, llvmorg-12-init, llvmorg-10.0.1, llvmorg-10.0.1-rc4, llvmorg-10.0.1-rc3, llvmorg-10.0.1-rc2, llvmorg-10.0.1-rc1 |
|
| #
bd06c417 |
| 28-Apr-2020 |
Valeriy Savchenko <[email protected]> |
[analyzer] Allow bindings of the CompoundLiteralRegion
Summary: CompoundLiteralRegions have been properly modeled before, but 'getBindingForElement` was not changed to accommodate this change proper
[analyzer] Allow bindings of the CompoundLiteralRegion
Summary: CompoundLiteralRegions have been properly modeled before, but 'getBindingForElement` was not changed to accommodate this change properly.
rdar://problem/46144644
Differential Revision: https://reviews.llvm.org/D78990
show more ...
|
| #
d70ec366 |
| 26-May-2020 |
Adam Balogh <[email protected]> |
[Analyzer][NFC] Remove the SubEngine interface
The `SubEngine` interface is an interface with only one implementation `EpxrEngine`. Adding other implementations are difficult and very unlikely in th
[Analyzer][NFC] Remove the SubEngine interface
The `SubEngine` interface is an interface with only one implementation `EpxrEngine`. Adding other implementations are difficult and very unlikely in the near future. Currently, if anything from `ExprEngine` is to be exposed to other classes it is moved to `SubEngine` which restricts the alternative implementations. The virtual methods are have a slight perofrmance impact. Furthermore, instead of the `LLVM`-style inheritance a native inheritance is used here, which renders `LLVM` functions like e.g. `cast<T>()` unusable here. This patch removes this interface and allows usage of `ExprEngine` directly.
Differential Revision: https://reviews.llvm.org/D80548
show more ...
|
|
Revision tags: llvmorg-10.0.0, llvmorg-10.0.0-rc6, llvmorg-10.0.0-rc5, llvmorg-10.0.0-rc4, llvmorg-10.0.0-rc3, llvmorg-10.0.0-rc2 |
|
| #
af3d0d16 |
| 30-Jan-2020 |
Charusso <[email protected]> |
[analyzer] DynamicSize: Remove 'getSizeInElements()' from store
Summary: This patch uses the new `DynamicSize.cpp` to serve dynamic information. Previously it was static and probably imprecise data.
[analyzer] DynamicSize: Remove 'getSizeInElements()' from store
Summary: This patch uses the new `DynamicSize.cpp` to serve dynamic information. Previously it was static and probably imprecise data.
Reviewed By: NoQ
Differential Revision: https://reviews.llvm.org/D69599
show more ...
|
|
Revision tags: llvmorg-10.0.0-rc1 |
|
| #
601687bf |
| 30-Jan-2020 |
Charusso <[email protected]> |
[analyzer] DynamicSize: Remove 'getExtent()' from regions
Summary: This patch introduces a placeholder for representing the dynamic size of regions. It also moves the `getExtent()` method of `SubReg
[analyzer] DynamicSize: Remove 'getExtent()' from regions
Summary: This patch introduces a placeholder for representing the dynamic size of regions. It also moves the `getExtent()` method of `SubRegions` to the `MemRegionManager` as `getStaticSize()`.
Reviewed By: NoQ
Differential Revision: https://reviews.llvm.org/D69540
show more ...
|
|
Revision tags: llvmorg-11-init, llvmorg-9.0.1, llvmorg-9.0.1-rc3 |
|
| #
040c39d5 |
| 06-Dec-2019 |
Artem Dergachev <[email protected]> |
[analyzer] Fix false positive on introspection of a block's internal layout.
When implementation of the block runtime is available, we should not warn that block layout fields are uninitialized simp
[analyzer] Fix false positive on introspection of a block's internal layout.
When implementation of the block runtime is available, we should not warn that block layout fields are uninitialized simply because they're on the stack.
show more ...
|
|
Revision tags: llvmorg-9.0.1-rc2, llvmorg-9.0.1-rc1, llvmorg-9.0.0, llvmorg-9.0.0-rc6, llvmorg-9.0.0-rc5, llvmorg-9.0.0-rc4, llvmorg-9.0.0-rc3 |
|
| #
630f7daf |
| 28-Aug-2019 |
Artem Dergachev <[email protected]> |
[analyzer] Fix analyzer warnings on analyzer.
Write tests for the actual crash that was found. Write comments and refactor code around 17 style bugs and suppress 3 false positives.
Differential Rev
[analyzer] Fix analyzer warnings on analyzer.
Write tests for the actual crash that was found. Write comments and refactor code around 17 style bugs and suppress 3 false positives.
Differential Revision: https://reviews.llvm.org/D66847
llvm-svn: 370246
show more ...
|