[PATCH] D105340: [analyzer] Produce SymbolCast symbols for integral types in SValBuilder::evalCast
Denys Petrov via Phabricator via cfe-commits
cfe-commits at lists.llvm.org
Fri Jul 2 09:46:38 PDT 2021
ASDenysPetrov added a comment.
In D105340#2855387 <https://reviews.llvm.org/D105340#2855387>, @vsavchenko wrote:
> Also, although the test is very extensive, it is pretty lopsided at the same time. C-style cast is only one case out of the myriad of all explicit and, more importantly, implicit casts.
I agree in a part of size, but these C-style casts generates the same AST tree as all other ex/implicit forms of casts . Though, casts can look completely differently but at a low level they are very similar.
Here is an example:
void test(long x) {
(llong)(short)(char)x;
}
FunctionDecl 0xbc306b8 <test.cpp:1:1, line:3:1> line:1:6 test 'void (long)'
|-ParmVarDecl 0xbc305f0 <col:11, col:16> col:16 used x 'long'
`-CompoundStmt 0xbc9f4b0 <col:19, line:3:1>
`-CStyleCastExpr 0xbc9f488 <line:2:3, col:27> 'long long' <NoOp>
`-ImplicitCastExpr 0xbc9f470 <col:14, col:27> 'long long' <IntegralCast> part_of_explicit_cast
`-CStyleCastExpr 0xbc9f430 <col:14, col:27> 'short' <NoOp>
`-ImplicitCastExpr 0xbc9f418 <col:21, col:27> 'short' <IntegralCast> part_of_explicit_cast
`-CStyleCastExpr 0xbc9f3d8 <col:21, col:27> 'char' <NoOp>
`-ImplicitCastExpr 0xbc9f3c0 <col:27> 'char' <IntegralCast> part_of_explicit_cast
`-ImplicitCastExpr 0xbc9f3a8 <col:27> 'long' <LValueToRValue> part_of_explicit_cast
`-DeclRefExpr 0xbc9f378 <col:27> 'long' lvalue ParmVar 0xbc305f0 'x' 'long'
and
void test(long x) {
char c = x;
if(static_cast<short>(c) == -1ll);
}
`-FunctionDecl 0xbc606b8 <test.cpp:1:1, line:4:1> line:1:6 test 'void (long)'
|-ParmVarDecl 0xbc605f0 <col:11, col:16> col:16 used x 'long'
`-CompoundStmt 0xbcd0598 <col:19, line:4:1>
|-DeclStmt 0xbcd0450 <line:2:3, col:13>
| `-VarDecl 0xbcd0398 <col:3, col:12> col:8 used c 'char' cinit
| `-ImplicitCastExpr 0xbcd0438 <col:12> 'char' <IntegralCast>
| `-ImplicitCastExpr 0xbcd0420 <col:12> 'long' <LValueToRValue>
| `-DeclRefExpr 0xbcd0400 <col:12> 'long' lvalue ParmVar 0xbc605f0 'x' 'long'
`-IfStmt 0xbcd0578 <line:3:3, col:36>
|-BinaryOperator 0xbcd0550 <col:6, col:32> 'bool' '=='
| |-ImplicitCastExpr 0xbcd0538 <col:6, col:26> 'long long' <IntegralCast>
| | `-CXXStaticCastExpr 0xbcd04d0 <col:6, col:26> 'short' static_cast<short> <NoOp>
| | `-ImplicitCastExpr 0xbcd04b8 <col:25> 'short' <IntegralCast> part_of_explicit_cast
| | `-ImplicitCastExpr 0xbcd04a0 <col:25> 'char' <LValueToRValue> part_of_explicit_cast
| | `-DeclRefExpr 0xbcd0468 <col:25> 'char' lvalue Var 0xbcd0398 'c' 'char'
| `-UnaryOperator 0xbcd0520 <col:31, col:32> 'long long' prefix '-'
| `-IntegerLiteral 0xbcd0500 <col:32> 'long long' 1
`-NullStmt 0xbcd0570 <col:36>
We can see similar `IntegralCast` for both variants. I was aiming to generate all the cases of `IntegralCast` and C-style cast is enough for me.
================
Comment at: clang/include/clang/StaticAnalyzer/Core/AnalyzerOptions.def:318
+ANALYZER_OPTION(bool, ShouldHandleIntegralCastForRanges,
+ "handle-integral-cast-for-ranges",
+ "Handle truncations, promotions and conversions for ranges of "
----------------
vsavchenko wrote:
> BTW, mb it should be less specific? Something like `ShouldSupportSymbolicIntegerCasts`?
> BTW 2, do you even plan on supporting symbolic casts in other cases?
> ShouldSupportSymbolicIntegerCasts?
Thanks. I thought about an appropriate name but failed to come up. That's what we need!
> BTW 2, do you even plan on supporting symbolic casts in other cases?
I think about adding //bool-int//, //int-bool//, //ptr-int//, //int-ptr// to the list.
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D105340/new/
https://reviews.llvm.org/D105340
More information about the cfe-commits
mailing list