[cfe-dev] [analyzer] VisitIncDecOp store
Rafael·Stahl via cfe-dev
cfe-dev at lists.llvm.org
Fri Apr 6 04:56:32 PDT 2018
Hi,
While developing a checker I have noticed that in the checkLocation
callback I received an unexpected Expr. It was an UnaryOperator of
non-pointer type and its SVal was a loc::ConcreteInt which doesn't
really make sense in my opinion.
When looking into this in ExprEngineC.cpp
ExprEngine::VisitIncrementDecrementOperator I noticed that the calls to
evalStore pass the whole UnaryOperator Expr as third argument LocationE.
This LocationE is documented as "The location expression that is stored
to". I would have understood this as the sub-expression of the UnaryOp
instead of the Op itself.
In particular:
-evalStore(Dst3, U, U, ...);
+evalStore(Dst3, U, Ex, ...);
Example:
volatile int *p;
(*p)++;
UnaryOperator 0x1bad960 'int' postfix '++'
`-ParenExpr 0x1bad940 'volatile int' lvalue
`-UnaryOperator 0x1bad920 'volatile int' lvalue prefix '*' cannot
overflow
`-ImplicitCastExpr 0x1bad908 'volatile int *' <LValueToRValue>
`-DeclRefExpr 0x1bad8e0 'volatile int *' lvalue Var 0x1bad320 'p'
'volatile int *'
Here the outer UnaryOp is passed as SVal in checkLocation instead of the
inner one.
Is my understanding correct? In that case I'm able to submit a patch.
Best regards
Rafael
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5449 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180406/8021e210/attachment.bin>
More information about the cfe-dev
mailing list