[cfe-dev] ASan alloc-dealloc-mismatch and placement new

Stephan Bergmann via cfe-dev cfe-dev at lists.llvm.org
Mon Nov 13 23:10:30 PST 2017


On 11/14/2017 12:41 AM, Kostya Serebryany wrote:
> On Mon, Nov 13, 2017 at 7:55 AM, Stephan Bergmann via cfe-dev 
> <cfe-dev at lists.llvm.org <mailto:cfe-dev at lists.llvm.org>> wrote:
> 
>     For a C++ program like
> 
>         #include <new>
>         int main() {
>              char * p1 = new char[sizeof (int)];
>              int * p2 = new(p1) int;
>              delete p2;
>         }
> 
> 
>     compiling it with -fsanitize=address will somewhat unhelpfully
>     report an "AddressSanitizer: alloc-dealloc-mismatch (operator new []
>     vs operator delete)" failure.
> 
>     Is there a good way to work around that
> 
> Why not use "delete [] p1"?

Because in the real program, p2 is then passed off to some API that 
takes ownership, and internally calls delete.  And both real and fake 
int* are handed off to that API, and I don't even control that API's 
implementation, so it can't be changed to a delete[] of the char array 
there.  Also, the real program uses a class type with non-trivial 
destructor instead of int.  (I probably should have been more careful 
when crafting this stripped-down example.)

(But the more I think about it, the less I'm sure the code is even legal...)

>     (in the program's source code), short of using the generic ASan
>     facilities of suppressing or blacklisting code, or using
>     ASAN_OPTIONS=alloc_dealloc_mismatch=0 to disable the check completely?


More information about the cfe-dev mailing list