[cfe-dev] [analyzer] Should we invalidate the `this` pointer?

Henry Wong via cfe-dev cfe-dev at lists.llvm.org
Mon Apr 2 00:47:03 PDT 2018


Hi Artem,

Thank you for your explanation1 You are right, invalidation of the region
contents of the class object is correct and common. However `this` pointer i
s no-lvalue and it's a `prvalue expression` in c++17. IMHO, invalidation of `CXXThisObjectRegion` is incorrect and violates the C++ standard.

Given the code below:
--------------------------------------------------------------------------------
   // $ clang -cc1 -analyze -analyzer-checker=core,debug.ExprInspection
   //    -analyzer-config widen-loops=true test.cpp

  1 void clang_analyzer_eval(int);
  2
  3 struct A {
  4     int num;
  5     void func(int i) {
  6         int sum = 0;
  7         clang_analyzer_eval(sum == 0); // should be true
  8         for (i = 0; i < 100; ++i) { sum++; }
  9         num = 0;
 10     }
 11 };
 12
 13 int main() {
 14     A a;
 15     a.num = 10;
 16     a.func(10);
 17     clang_analyzer_eval(a.num == 0); // UNKNOWN, should be true.
 18 }
--------------------------------------------------------------------------------

Before invalidation,
--------------------------------------------------------------------------------
Store (direct and default bindings), 0x7f9de8014d90 :
(a,0,direct) : 10 S32b

(i,0,direct) : 3 S32b

(this,0,direct) : &a

(sum,0,direct) : 3 S32b
--------------------------------------------------------------------------------

After invalidation,
--------------------------------------------------------------------------------
Store (direct and default bindings), 0x7f9de8015828 :
(a,0,default) : conj_$2{int}

(i,0,direct) : conj_$3{int}

(this,0,direct) : &SymRegion{conj_$1{struct A *}}

(sum,0,direct) : conj_$0{int}
--------------------------------------------------------------------------------

`(this,0,direct) : &a` -> ` (this,0,direct) : &SymRegion{conj_$1{struct A *}}`
is  inaccurate and too conservative. The more serious problem is that the
corresponding relationship between `this` pointer and its corresponding
Object-Region has been broken. Modifications to data member do not affect
the actual Object-Region because at this time `this` pointer is pointing to a
`SymbolicRegion`. For example, there should emit `TRUE` at the line 17 in
the sample code, but emitted `UNKNOWN` instead.

Henry Wong
Qihoo 360 Codesafe Team
________________________________
From: Artem Dergachev <noqnoqneo at gmail.com>
Sent: Monday, April 2, 2018 8:31
To: Henry Wong; cfe-dev at lists.llvm.org
Cc: Péter Szécsi
Subject: Re: [cfe-dev] [analyzer] Should we invalidate the `this` pointer?

This assertion is pretty fundamental. Invalidation, if done correctly,
should not have triggered it - after all, invalidation could occur for
any other reason, not necessarily because of loop widening.

Invalidation of this-region contents (that is, not of the
CXXThisObjectRegion of the current stack frame, but of the actual
this-region which is a pointee of the CXXThisObjectRegion) sounds
reasonable if the region is modified within the loop - which is going to
often be the case.

On 3/31/18 2:02 AM, Henry Wong via cfe-dev wrote:
> Hi all,
>
> I recently encountered a assertion failure as shown below.
>
> `Assertion `!InitValWithAdjustments.getAs<Loc>() ||
> Loc::isLocType(Result->getType()) ||
> Result->getType()->isMemberPointerType()' failed`
>
> The code that will trigger this assertion failed.
> ----------------------------------------------------------------------------------------------------
> struct BlockId {
> BlockId();
> };
>
> void goo(BlockId id);
>
> BlockId::BlockId() {
> int count = 10;
> do {
>
> } while (count--);
> }
>
> int main() {
> goo(BlockId());
> }
> ----------------------------------------------------------------------------------------------------
>
> The reason is that the analyzer invalidate the `this` pointer
> at loop-widen. The more essential question is "Should we invalidate
> the `this` pointer?"
>
> Thanks in advance!
>
> Henry Wong
> Qihoo 360 Codesafe Team
>
>
> _______________________________________________
> cfe-dev mailing list
> cfe-dev at lists.llvm.org
> http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/cfe-dev/attachments/20180402/87d429e5/attachment.html>


More information about the cfe-dev mailing list