[Bug tree-optimization/98160] [11 Regression] ICE in default_tree_printer at gcc/tree-diagnostic.c:270 since r11-5732-gdce6c58db87ebf7f

msebor at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Mon Dec 7 00:32:36 GMT 2020


https://gcc.gnu.org/bugzilla/show_bug.cgi?id=98160

Martin Sebor <msebor at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |diagnostic
             Status|NEW                         |ASSIGNED
           Assignee|unassigned at gcc dot gnu.org      |msebor at gcc dot gnu.org

--- Comment #1 from Martin Sebor <msebor at gcc dot gnu.org> ---
The test case actually exposes two bugs: besides the ICE, the more interesting
problem is the false positive.  The warning considers pointers with positive
offsets invalid arguments to all deallocation functions.  That's fair for
arguments to pairs of calls to allocation and deallocation functions but not
necessarily when just the deallocator is known and not also the allocator the
pointer was obtained from.  A simple test case for that, reduced from the two
translation units in comment #0, is below:

$ cat t.C && gcc -O2 -S -Wall t.C
struct MemoryManager { void* allocate (); };

struct XMemory
{
  void* operator new (__SIZE_TYPE__, MemoryManager *mgr)
  {
    void *p = mgr->allocate ();
    return (char*)p + sizeof(MemoryManager);
  }

  void operator delete (void*, MemoryManager*);
};

struct XMLMutex: XMemory {
  XMLMutex();
};

void gValidatorMutex (MemoryManager *mgr) { new (mgr) XMLMutex; }
t.C: In function ‘void gValidatorMutex(MemoryManager*)’:
t.C:18:55: warning: ‘static void XMemory::operator delete(void*,
MemoryManager*)’ called on pointer ‘<unknown>’ with nonzero offset 1
[-Wfree-nonheap-object]
   18 | void gValidatorMutex (MemoryManager *mgr) { new (mgr) XMLMutex; }
      |                                                       ^~~~~~~~
t.C:7:29: note: returned from a call to ‘void* MemoryManager::allocate()’
    7 |     void *p = mgr->allocate ();
      |               ~~~~~~~~~~~~~~^~


More information about the Gcc-bugs mailing list