On 12/20/23 14:20, Jakub Jelinek wrote:
Hi!
The following patch enables the -Walloc-size and -Wcalloc-transposed-args
warnings for C++ as well.
Ok for trunk if it passes bootstrap/regtest?
2023-12-20 Jakub Jelinek <ja...@redhat.com>
gcc/c-family/
* c.opt (Walloc-size): Enable also for C++ and ObjC++.
gcc/cp/
* cp-gimplify.cc (cp_genericize_r): If warn_alloc_size, call
warn_for_alloc_size for -Walloc-size diagnostics.
* semantics.cc (finish_call_expr): If warn_calloc_transposed_args,
call warn_for_calloc for -Wcalloc-transposed-args diagnostics.
gcc/testsuite/
* g++.dg/warn/Walloc-size-1.C: New test.
* g++.dg/warn/Wcalloc-transposed-args-1.C: New test.
--- gcc/c-family/c.opt.jj 2023-12-20 11:31:07.897806698 +0100
+++ gcc/c-family/c.opt 2023-12-20 20:02:36.889910599 +0100
@@ -332,7 +332,7 @@ C ObjC C++ ObjC++ Var(warn_alloca) Warni
Warn on any use of alloca.
Walloc-size
-C ObjC Var(warn_alloc_size) Warning LangEnabledBy(C ObjC, Wextra)
+C ObjC C++ ObjC++ Var(warn_alloc_size) Warning LangEnabledBy(C ObjC C++
ObjC++, Wextra)
Warn when allocating insufficient storage for the target type of the assigned
pointer.
Walloc-size-larger-than=
--- gcc/cp/cp-gimplify.cc.jj 2023-12-15 10:08:53.877236695 +0100
+++ gcc/cp/cp-gimplify.cc 2023-12-20 20:10:59.689914648 +0100
@@ -2048,6 +2048,25 @@ cp_genericize_r (tree *stmt_p, int *walk
case NOP_EXPR:
*stmt_p = predeclare_vla (*stmt_p);
+
+ /* Warn of new allocations that are not big enough for the target
+ type. */
+ if (warn_alloc_size
+ && TREE_CODE (TREE_OPERAND (stmt, 0)) == CALL_EXPR
+ && POINTER_TYPE_P (TREE_TYPE (stmt)))
+ {
+ if (tree fndecl = get_callee_fndecl (TREE_OPERAND (stmt, 0)))
+ if (DECL_IS_MALLOC (fndecl))
+ {
+ tree attrs = TYPE_ATTRIBUTES (TREE_TYPE (fndecl));
+ tree alloc_size = lookup_attribute ("alloc_size", attrs);
+ if (alloc_size)
+ warn_for_alloc_size (EXPR_LOCATION (stmt),
+ TREE_TYPE (TREE_TYPE (stmt)),
+ TREE_OPERAND (stmt, 0), alloc_size);
+ }
+ }
+
if (!wtd->no_sanitize_p
&& sanitize_flags_p (SANITIZE_NULL | SANITIZE_ALIGNMENT)
&& TYPE_REF_P (TREE_TYPE (stmt)))
--- gcc/cp/semantics.cc.jj 2023-12-14 07:49:53.150580801 +0100
+++ gcc/cp/semantics.cc 2023-12-20 20:13:33.773772759 +0100
@@ -2939,15 +2939,24 @@ finish_call_expr (tree fn, vec<tree, va_
if (!result)
{
- if (warn_sizeof_pointer_memaccess
+ tree alloc_size_attr = NULL_TREE;
+ if (warn_calloc_transposed_args
+ && TREE_CODE (fn) == FUNCTION_DECL
+ && (alloc_size_attr
+ = lookup_attribute ("alloc_size",
+ TYPE_ATTRIBUTES (TREE_TYPE (fn)))))
+ if (TREE_VALUE (alloc_size_attr) == NULL_TREE
+ || TREE_CHAIN (TREE_VALUE (alloc_size_attr)) == NULL_TREE)
+ alloc_size_attr = NULL_TREE;
+ if ((warn_sizeof_pointer_memaccess || alloc_size_attr)
&& (complain & tf_warning)
&& !vec_safe_is_empty (*args)
&& !processing_template_decl)
{
- location_t sizeof_arg_loc[3];
- tree sizeof_arg[3];
+ location_t sizeof_arg_loc[6];
+ tree sizeof_arg[6];
Why do we need to check 6 args for calloc? The patch is OK, just wondering.
Jason