[PATCH] D126481: [analyzer] Handle SymbolCast in SValBuilder
Gabor Marton via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Mon May 30 02:49:32 PDT 2022
martong marked an inline comment as done.
martong added a comment.
In D126481#3542919 <https://reviews.llvm.org/D126481#3542919>, @ASDenysPetrov wrote:
> @martong As you said, my solution D103096 <https://reviews.llvm.org/D103096> suppose to pass these and more other tests cases. So how it will help in combination with my solution D103096 <https://reviews.llvm.org/D103096>?
> Although, your patch is really simple but it's more like a plug then a real `SymbolCast ` support, isn't it? I don't quite understand the motivation.
This part of the SValBuilder is responsible for **constant folding**. We need this constant folding, so the engine can work with less symbols, this way it can be more efficient. Whenever a symbol is constrained with a constant then we substitute the symbol with the corresponding integer. If a symbol is constrained with a range, then the symbol is kept and we fall-back to use the range based constraint manager, which is not that efficient. This patch is the natural extension of the existing constant folding machinery with the support of `SymbolCast` symbols.
================
Comment at: clang/lib/StaticAnalyzer/Core/SimpleSValBuilder.cpp:1354
+ return I->second;
+ const SymExpr *OpSym = S->getOperand();
+ SVal OpVal = getConstOrVisit(OpSym);
----------------
ASDenysPetrov wrote:
> Should this imply to use the root symbol and not the second nested one?
> E.g. from `(int)(short)(x)` do you want `(short)(x)` or `(x)`?
> `getOperand` gives you `(short)(x)` in this case.
We need the operand, with your words it is the second nested one, not the root. In case of `(int)(short)(x)` we need the `(short)(x)`.
Repository:
rG LLVM Github Monorepo
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D126481/new/
https://reviews.llvm.org/D126481
More information about the cfe-commits
mailing list