Attached is a simple middle end implementation of detection of mismatched pairs of calls to C++ new and delete, along with a substantially enhanced implementation of -Wfree-nonheap-object. The latter option has been in place since 2011 but detected only the most trivial bugs. Unlike the Clang -Wmismatched-new-delete which diagnoses declarations of "overloaded operator new() and operator delete() functions that do not have a corresponding free store function defined within the same scope", this patch detects mismatches between calls to allocation and deallocation functions, such as calling free() on the result of new, of delete on the result of array new. The functionality provided by Clang can be added on top of what this feature does and since they are so close I think it's fine to have both under the same option (a new level could be introduced to distinguish the two). The -Wfree-nonheap-object enhancement lets the warning detect all calls to free, realloc, or C++ delete, with pointers that can be proven not to point to the first byte of an allocated object. The patch relies on the well-tested compute_objsize() function for the determination of pointer provenance and makes use of the changes in the following patch submitted for review just yesterday: https://gcc.gnu.org/pipermail/gcc-patches/2020-November/557807.html As usual, I tested on x86_64-linux with Glibc & Binutils/GDB with no new false positives. Martin PS A few words on the implementation choices: The new code is in builtins.c only because -Wfree-nonheap-object is there. I still plan to move all of the invalid access checking code into its own module or pass at some point but I didn't want to make this improvement contingent on that restructuring. Even though it's all in builtins.c, the code is called from calls.c. This is so that simple mismatches can be diagnosed even when free isn't handed in builtins.c (i.e., without optimization). The warning makes no attempt to analyze the CFG or handle conditional mismatches. That will have to wait until the code is moved to a GIMPLE pass.