To help detect common kinds of memory (and other resource) management bugs, GCC 11 adds support for the detection of mismatched calls to allocation and deallocation functions. At each call site to a known deallocation function GCC checks the set of allocation functions the former can be paired with and, if the two don't match, issues a -Wmismatched-dealloc warning (something similar happens in C++ for mismatched calls to new and delete). GCC also uses the same mechanism to detect attempts to deallocate objects not allocated by any allocation function (or pointers past the first byte into allocated objects) by -Wfree-nonheap-object. This support is enabled for built-in functions like malloc and free. To extend it beyond those, GCC extends attribute malloc to designate a deallocation function to which pointers returned from the allocation function may be passed to deallocate the allocated objects. Another, optional argument designates the positional argument to which the pointer must be passed. The attached change is the first step in enabling this extended support for Glibc. It enables GCC to diagnose mismatched calls such as in tst-popen.c1: FILE *f = popen ("foo", "r"); ... fclose (f); warning: ‘fclose’ called on pointer returned from a mismatched allocation function [-Wmismatched-dealloc] 83 | fclose (f); | ^~~~~~~~~~ note: returned from ‘popen’ 81 | FILE *f = popen ("foo", "r"); | ^~~~~~~~~~~~~~~~~~ Since doesn't declare free() and realloc() the patch uses __builtin_free and __builtin_realloc as the deallocators. This isn't pretty but I couldn't think of a more elegant way to do it. (I also missed this bit in the initial implementation of the attribute so current trunk doesn't handle the __builtin_xxx forms. I submitted a patch to handle it just today, but to avoid delays, I post this solution for comments ahead of its acceptance). Since the deallocation function referenced by the malloc attribute must have been declared, the changes require rearranging the order of the declarations a bit. I tested the changes by rebuilding Glibc on x86_64 and by verifying that warnings are issued where appropriate for my little test program but not much else. Neither set of changes (either in GCC or in Glibc) impacts code generation and should make no difference in testing (I didn't see any.) If there is support for this approach I'll work on extending it to other headers, hopefully before the upcoming Glibc release. Thanks Martin