[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