[cfe-dev] [analyzer] VisitIncDecOp store

Rafael·Stahl via cfe-dev cfe-dev at lists.llvm.org
Mon Apr 9 00:23:47 PDT 2018


The SVal argument of checkLocation is a loc::ConcreteInt and has the 
value of the pointer p in my example. This is some address and seems 
correct (it is statically determinable). The only thing that seems 
inconsistent/misleading is that the Stmt argument of checkLocation is 
pointing to the IncDecOp instead of the dereference.


On 08.04.2018 01:12, Artem Dergachev wrote:
> Looks like a bug, yeah. Though it's probable that some checkers have 
> already "adapted" to it.
>
> That said, a non-pointer prvalue expression that has a value of 
> loc::ConcreteInt kind sounds like a bigger bug (regardless of whether 
> it's the expression that we're looking for). Is it the value that was 
> supplied in the callback, or is it the actual value of the unary 
> operator expression (i.e. `State->getSVal(UnaryOp, LCtx)`)?
>
> On 4/6/18 4:56 AM, Rafael·Stahl via cfe-dev wrote:
>> 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
>>
>>
>>
>>
>> _______________________________________________
>> cfe-dev mailing list
>> cfe-dev at lists.llvm.org
>> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev
>


-------------- 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/20180409/5fb7cd81/attachment.bin>


More information about the cfe-dev mailing list