[PATCH] D115932: [Analyzer] Create and handle SymbolCast for pointer to integral conversion
Gabor Marton via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Wed Jan 12 09:07:51 PST 2022
martong added a comment.
Thanks for the review guys.
Artem, I agree, that we should remove `LocAsInteger`. `LocaAsInteger` is a primitive handling of a specific cast operation (when we cast a pointer to an integer). The integration of `LocaAsInteger` into the `SymExpr` hierarchy is problematic as both this patch and its parent shows.
For precision, we should produce a `SymbolCast` when we evaluate a cast operation of a pointer to an integral type. I agree with Denys, that `makeSymExprValNN` is probably not the best place to do that. I took Denys' patch D105340 <https://reviews.llvm.org/D105340> and created a prototype on top of that to create the `SymbolCast` in `SValBuilder::evalCastSubKind(loc::MemRegionVal V,`.
void test_param(int *p) {
long p_as_integer = (long)p;
clang_analyzer_dump(p); // expected-warning{{&SymRegion{reg_$0<int * p>}}}
clang_analyzer_dump(p_as_integer); // expected-warning{{(long) (reg_$0<int * p>)}}
I'd like to upload that soon.
Once we produce the `SymbolCast`s, then we can start handling them semantically. In my opinion, we should follow these steps:
1. Produce `SymbolCast`s. This is done in D105340 <https://reviews.llvm.org/D105340>, plus I am going to create another patch for pointer-to-int casts.
2. Handle `SymbolCast`s for the simplest cases. E.g. when we cast a (64bit width) pointer to a (64bit width unsigned) integer. This requires the foundation for an additional mapping in the `ProgramState` that can map a base symbol to cast symbols. This would be used in the constraint manager and this mapping must be super efficient.
3. Gradually handle more complex `SymbolCast` semantics. E.g. a widening cast.
4. Remove `LocAsInteger`. Produce the `SymbolCast`s by default and remove the option of `ShouldSupportSymbolicIntegerCasts`.
Point 2) and 3) are already started in D103096 <https://reviews.llvm.org/D103096>. But again, I think first we have to get the solid foundations with the `State` and with the `ConstraintManager` before getting into the more complex implementations of widening.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D115932/new/
https://reviews.llvm.org/D115932
More information about the cfe-commits
mailing list