diff options
author | Martin Sebor <msebor@redhat.com> | 2020-12-14 13:30:00 -0700 |
---|---|---|
committer | Martin Sebor <msebor@redhat.com> | 2020-12-14 13:30:00 -0700 |
commit | fe7f75cf16783589eedbab597e6d0b8d35d7e470 (patch) | |
tree | 7fec98daa8cd2d99d08d302f753fb7416f3e901c /gcc/doc/extend.texi | |
parent | e63ae8c083a3218400206b80d4eedd9950fc5d3f (diff) | |
download | gcc-fe7f75cf16783589eedbab597e6d0b8d35d7e470.zip gcc-fe7f75cf16783589eedbab597e6d0b8d35d7e470.tar.gz gcc-fe7f75cf16783589eedbab597e6d0b8d35d7e470.tar.bz2 |
Correct/improve maybe_emit_free_warning (PR middle-end/98166, PR c++/57111, PR middle-end/98160).
Resolves:
PR middle-end/98166 - bogus -Wmismatched-dealloc on user-defined allocator and inlining
PR c++/57111 - 57111 - Generalize -Wfree-nonheap-object to delete
PR middle-end/98160 - ICE in default_tree_printer at gcc/tree-diagnostic.c:270
gcc/ChangeLog:
PR middle-end/98166
PR c++/57111
PR middle-end/98160
* builtins.c (check_access): Call tree_inlined_location
fndecl_alloc_p): Handle BUILT_IN_ALIGNED_ALLOC and
BUILT_IN_GOMP_ALLOC.
call_dealloc_p): Remove unused function.
(new_delete_mismatch_p): Call valid_new_delete_pair_p and rework.
(matching_alloc_calls_p): Handle built-in deallocation functions.
(warn_dealloc_offset): Corrct the handling of user-defined operators
delete.
(maybe_emit_free_warning): Avoid assuming expression is a decl.
Simplify.
* doc/extend.texi (attribute malloc): Update.
* tree-ssa-dce.c (valid_new_delete_pair_p): Factor code out into
valid_new_delete_pair_p in tree.c.
* tree.c (tree_inlined_location): Define new function.
(valid_new_delete_pair_p): Define.
* tree.h (tree_inlined_location): Declare.
(valid_new_delete_pair_p): Declare.
gcc/c-family/ChangeLog:
PR middle-end/98166
PR c++/57111
PR middle-end/98160
* c-attribs.c (maybe_add_noinline): New function.
(handle_malloc_attribute): Call it. Use ATTR_FLAG_INTERNAL.
Implicitly add attribute noinline to functions not declared inline
and warn on those.
libstdc++-v3/ChangeLog:
* testsuite/ext/vstring/requirements/exception/basic.cc: Suppress
a false positive warning.
* testsuite/ext/vstring/requirements/exception/propagation_consistent.cc:
Same.
gcc/testsuite/ChangeLog:
PR middle-end/98166
PR c++/57111
PR middle-end/98160
* g++.dg/warn/Wmismatched-dealloc-2.C: Adjust test of expected warning.
* g++.dg/warn/Wmismatched-new-delete.C: Same.
* gcc.dg/Wmismatched-dealloc.c: Same.
* c-c++-common/Wfree-nonheap-object-2.c: New test.
* c-c++-common/Wfree-nonheap-object-3.c: New test.
* c-c++-common/Wfree-nonheap-object.c: New test.
* c-c++-common/Wmismatched-dealloc.c: New test.
* g++.dg/warn/Wfree-nonheap-object-3.C: New test.
* g++.dg/warn/Wfree-nonheap-object-4.C: New test.
* g++.dg/warn/Wmismatched-dealloc-2.C: New test.
* g++.dg/warn/Wmismatched-new-delete-2.C: New test.
* g++.dg/warn/Wmismatched-new-delete.C: New test.
* gcc.dg/Wmismatched-dealloc-2.c: New test.
* gcc.dg/Wmismatched-dealloc-3.c: New test.
* gcc.dg/Wmismatched-dealloc.c: New test.
Diffstat (limited to 'gcc/doc/extend.texi')
-rw-r--r-- | gcc/doc/extend.texi | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 0c96908..e73464a 100644 --- a/gcc/doc/extend.texi +++ b/gcc/doc/extend.texi @@ -3257,37 +3257,37 @@ as they may return pointers to storage containing pointers to existing objects. Associating a function with a @var{deallocator} helps detect calls to -mismatched allocation and deallocation functions and diagnose them -under the control of options such as @option{-Wmismatched-dealloc}. -To indicate that an allocation function both satisifies the nonaliasing -property and has a deallocator associated with it, both the plain form -of the attribute and the one with the @var{deallocator} argument must -be used. +mismatched allocation and deallocation functions and diagnose them under +the control of options such as @option{-Wmismatched-dealloc}. To indicate +that an allocation function both satisifies the nonaliasing property and +has a deallocator associated with it, both the plain form of the attribute +and the one with the @var{deallocator} argument must be used. The same +function can be both an allocator and a deallocator. Since inlining one +of the associated functions but not the other could result in apparent +mismatches, this form of attribute @code{malloc} is not accepted on inline +functions. For the same reason, using the attribute prevents both +the allocation and deallocation functions from being expanded inline. For example, besides stating that the functions return pointers that do -not alias any others, the following declarations make the @code{fclose} -and @code{frepen} functions suitable deallocators for pointers returned -from all the functions that return them, and the @code{pclose} function -as the only other suitable deallocator besides @code{freopen} for pointers -returned from @code{popen}. The deallocator functions must declared -before they can be referenced in the attribute. +not alias any others, the following declarations make @code{fclose} +a suitable deallocator for pointers returned from all functions except +@code{popen}, and @code{pclose} as the only suitable deallocator for +pointers returned from @code{popen}. The deallocator functions must +declared before they can be referenced in the attribute. @smallexample -int fclose (FILE*); -FILE* freopen (const char*, const char*, FILE*); -int pclose (FILE*); +int fclose (FILE*); +int pclose (FILE*); -__attribute__ ((malloc, malloc (fclose), malloc (freopen, 3))) +__attribute__ ((malloc, malloc (fclose (1)))) FILE* fdopen (int); -__attribute__ ((malloc, malloc (fclose), malloc (freopen, 3))) +__attribute__ ((malloc, malloc (fclose (1)))) FILE* fopen (const char*, const char*); -__attribute__ ((malloc, malloc (fclose), malloc (freopen, 3))) +__attribute__ ((malloc, malloc (fclose (1)))) FILE* fmemopen(void *, size_t, const char *); -__attribute__ ((malloc, malloc (fclose), malloc (freopen, 3))) - FILE* freopen (const char*, const char*, FILE*); -__attribute__ ((malloc, malloc (pclose), malloc (freopen, 3))) +__attribute__ ((malloc, malloc (pclose (1)))) FILE* popen (const char*, const char*); -__attribute__ ((malloc, malloc (fclose), malloc (freopen, 3))) +__attribute__ ((malloc, malloc (fclose (1)))) FILE* tmpfile (void); @end smallexample |