Charusso marked an inline comment as done.
Charusso added inline comments.

================
Comment at: clang/lib/StaticAnalyzer/Core/ExprEngineC.cpp:103
+        if (const MemRegion *LeftMR = LeftV.getAsRegion())
+          IsLhsPtr = LeftMR->getSymbolicBase();
+        if (const MemRegion *RightMR = RightV.getAsRegion())
----------------
NoQ wrote:
> How about the following test case in which not `Bar` but `&Bar` gets 
> bitwise-operated upon?
> 
> ```lang=c++
> C **test() {
>   C *Bar = new C;
>   C **Baz = &Bar;
>   Baz = reinterpret_cast<C **>(reinterpret_cast<uintptr_t>(Baz) | 0x1);
>   Baz = reinterpret_cast<C **>(reinterpret_cast<uintptr_t>(Baz) & 
> ~static_cast<uintptr_t>(0x1));
>   delete *Baz;
> }
> ```
> 
> The difference is that in this case the escaping region doesn't have a 
> symbolic base. And i believe that symbolic regions aren't special here in any 
> way.
> 
> I suggest doing an escape when the resulting value is unknown after 
> `evalBinOp` but regardless of any other conditions that you mentioned. Simply 
> because there's a loss of information.
That is a great idea! I wanted to make it more generic. Thanks you!


================
Comment at: clang/test/Analysis/symbol-escape.cpp:5-6
 
+// expected-no-diagnostics
+
 #include <stdint.h>
----------------
NoQ wrote:
> I think something went wrong while uploading the patch. This diff should add 
> this whole test file, not update it.
This is a test-driven-development-driven patch, first make the test fail, then 
make it pass.


================
Comment at: clang/test/Analysis/symbol-escape.cpp:7
+
 #include <stdint.h>
 
----------------
NoQ wrote:
> Relying on everybody's system headers is super flaky, don't do this in tests.
> 
> Please define stuff that you use directly like other tests do:
> ```lang=c++
> typedef unsigned __INTPTR_TYPE__ uintptr_t;
> ```
It is a predefined header in Modules so Windows will not break.

Please note that only one of the test files (malloc.c) use that definition, 
most of them using that I have used in D62926, so I believe this header is the 
correct one as it is in four tests and Windows-approved by D62926.


================
Comment at: clang/test/Analysis/symbol-escape.cpp:15
                                ~static_cast<uintptr_t>(0x1)) |
                               (reinterpret_cast<uintptr_t>(Bar) & 0x1));
   (void)Bar;
----------------
NoQ wrote:
> `Bar` is reduced to one bit here. It's a legit leak. I think you meant to 
> swap `Foo` and `Bar`.
I assumed that we are doing our low-bits magic, where we have two identical 
objects. The SymRegion sets up the HeapSymRegion's property, where no leak 
happen. We just could change the first low-bit and set up some crazy flag, like 
`isChecked()`, so we do not lost the tracking. Also we have four bits to 
change, so there is no edge case going on.


================
Comment at: clang/test/Analysis/symbol-escape.cpp:20
 
   delete Bar;
 }
----------------
NoQ wrote:
> In any case, passing a pointer to `delete` that wasn't obtained from `new` is 
> undefined behavior. In order to produce a test that's also a correct code, i 
> think we should either undo our bitwise operations, or perform an escape in a 
> different manner (say, return the pointer to the caller).
Whoops! I really wanted to make the test look great.


================
Comment at: clang/test/Analysis/symbol-escape.cpp:26
                               ~static_cast<uintptr_t>(0x1));
-  // expected-warning@-2 {{Potential leak of memory pointed to by 'Qux'}}
 
----------------
I have made it fail on master.


CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D63720/new/

https://reviews.llvm.org/D63720



_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to