From patchwork Sun Oct 1 11:41:21 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Alejandro Colomar X-Patchwork-Id: 147077 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:2a8e:b0:403:3b70:6f57 with SMTP id in14csp825777vqb; Sun, 1 Oct 2023 04:42:17 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHcLfBUmUFV7AcJN8IzSr4yVvE01kxfgKktoteV5fdbSC1u5eWTG7SJm6f6/29/aWl74lPs X-Received: by 2002:a17:906:c102:b0:98e:4f1:f987 with SMTP id do2-20020a170906c10200b0098e04f1f987mr7995492ejc.3.1696160537110; Sun, 01 Oct 2023 04:42:17 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1696160537; cv=none; d=google.com; s=arc-20160816; b=Ve/Vc5z9ZKug/TcTvwlxsYjekXGIoArBPb/kmLc/l236llx4bRFPHBpLDGR9fqJzvY INx7CClfAM3OyZTn9Qb0htJyAmxkdd8jzkgNM9QxDWadgbAavpIHyiX0JxY1jp1rtnwD pqVLVzOl4UZrsWesdIw2LSXLYo0Y/rKeqZCEoG4NSlY4itl5JFrHXf8LqsHDwBRJYhp6 2Etitk7wy++TaaUFt12vf8comwrJSAnwqC7JI5VykW7DSXi+ySLGhOS9OFmXvo1gxCzh 1QeccezqdH8+IRktWyMgLhnCxi0trHUHaMCl+VydTwgOY47axhVdQ8t+KLbPTpHRPX9j MRKQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:dmarc-filter:delivered-to; bh=cIVbOQgln/ffhEonhIrHDO3s4JOmdtQSjuYdgor1ACg=; fh=lrdUOwe2KbvBPmMC51v2GQKGTRlkYYn7I4swQNusl3U=; b=Ot3T66rX33zC8y6/7U5iSOgOHhAZzQfW3bL0MC5MJY923oDjdQZxIm77B0O37dWUu0 cvDBYvKZcjcI/Qb4a4cqZ3WWuscCD4NgbJKASWYxWa6k9n5/zCPNL7prC17xaEKPw+Qk +LL6+m/A2tzTPDk/cJl+Uc//dyDIdYAYp9R4jumOdM8MMBIBLVKVNdSkon+gaRt9DIml EPmaPY+/YEwgeWT2eTUsg7Twl2u2Trv4+rwIL5jug9jrkBjTaGTDVCgTe8fOKIrQA+rI HV+8zsyJ1baJp8sSfvbGlS3IAskA7PSnODqtHl82iXqGUmfiGfHvaSFNbBhvBMP9R4pY ILTg== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=f3OThfLy; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id i26-20020a170906091a00b0097394940619si9869918ejd.984.2023.10.01.04.42.16 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 01 Oct 2023 04:42:17 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@kernel.org header.s=k20201202 header.b=f3OThfLy; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=kernel.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id CBBE538323CB for ; Sun, 1 Oct 2023 11:42:10 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from sin.source.kernel.org (sin.source.kernel.org [145.40.73.55]) by sourceware.org (Postfix) with ESMTPS id BD2553858418 for ; Sun, 1 Oct 2023 11:41:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BD2553858418 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=kernel.org Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=kernel.org Received: from smtp.kernel.org (transwarp.subspace.kernel.org [100.75.92.58]) by sin.source.kernel.org (Postfix) with ESMTP id 53441CE0AB6; Sun, 1 Oct 2023 11:41:44 +0000 (UTC) Received: by smtp.kernel.org (Postfix) with ESMTPSA id 37650C433C8; Sun, 1 Oct 2023 11:41:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=kernel.org; s=k20201202; t=1696160503; bh=EAsQlNqlhyOEhO7KrCDm6ZvfJdGkljthq+OqXJI9ijo=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=f3OThfLyP9JIACznA6vrXg6kIR8OT7kVyIZAyTa6rPKcAodUgZz/MbhwZ9Mx6aVYj VU0+w3JQI3g/+tAm4z2wsnrwqswklV8bNTD1I07uSbjp/BmQHsbpfXYulbpwVvw234 KNlTar2pwottS4trSHX1Iik4HKiIuiCkoD0zBm67MG3d2D3Ly1kcEXarG9U51N2QK7 Cd0Ih7x7LluhqVd/OApnojs0oG9UDzPj24rNZpgtYuagCGXTkwAPCl5+ceT8DVqEh5 l9iJkGz988YRWxO6zrtLn181LGUTNUJ3n4187K80N6DKj/g7coxMetu1IXGhGz21mZ 1/T66wWIfEPSw== From: Alejandro Colomar To: gcc-patches@gcc.gnu.org Cc: Alejandro Colomar , Doug McIlroy , "G. Branden Robinson" , Ralph Corderoy , Dave Kemper , Larry McVoy , Andrew Pinski , Jonathan Wakely , Andrew Clayton , Martin Uecker , David Malcolm Subject: [PATCH v4] C, ObjC: Add -Wunterminated-string-initialization Date: Sun, 1 Oct 2023 13:41:21 +0200 Message-Id: <20231001114120.54695-1-alx@kernel.org> X-Mailer: git-send-email 2.40.1 In-Reply-To: References: MIME-Version: 1.0 X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1761258065294118016 X-GMAIL-MSGID: 1778553231393810904 Warn about the following: char s[3] = "foo"; Initializing a char array with a string literal of the same length as the size of the array is usually a mistake. Rarely is the case where one wants to create a non-terminated character sequence from a string literal. In some cases, for writing faster code, one may want to use arrays instead of pointers, since that removes the need for storing an array of pointers apart from the strings themselves. char *log_levels[] = { "info", "warning", "err" }; vs. char log_levels[][7] = { "info", "warning", "err" }; This forces the programmer to specify a size, which might change if a new entry is later added. Having no way to enforce null termination is very dangerous, however, so it is useful to have a warning for this, so that the compiler can make sure that the programmer didn't make any mistakes. This warning catches the bug above, so that the programmer will be able to fix it and write: char log_levels[][8] = { "info", "warning", "err" }; This warning already existed as part of -Wc++-compat, but this patch allows enabling it separately. It is also included in -Wextra, since it may not always be desired (when unterminated character sequences are wanted), but it's likely to be desired in most cases. Link: Link: Link: Acked-by: Doug McIlroy Cc: "G. Branden Robinson" Cc: Ralph Corderoy Cc: Dave Kemper Cc: Larry McVoy Cc: Andrew Pinski Cc: Jonathan Wakely Cc: Andrew Clayton Cc: Martin Uecker Cc: David Malcolm Signed-off-by: Alejandro Colomar --- v4: - Fix From: address gcc/c-family/c.opt | 4 ++++ gcc/c/c-typeck.cc | 6 +++--- gcc/testsuite/gcc.dg/Wunterminated-string-initialization.c | 6 ++++++ 3 files changed, 13 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/Wunterminated-string-initialization.c diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 44b9c862c14..e8f6b836836 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -1407,6 +1407,10 @@ Wunsuffixed-float-constants C ObjC Var(warn_unsuffixed_float_constants) Warning Warn about unsuffixed float constants. +Wunterminated-string-initialization +C ObjC Var(warn_unterminated_string_initialization) Warning LangEnabledBy(C ObjC,Wextra || Wc++-compat) +Warn about character arrays initialized as unterminated character sequences by a string literal. + Wunused C ObjC C++ ObjC++ LangEnabledBy(C ObjC C++ ObjC++,Wall) ; documented in common.opt diff --git a/gcc/c/c-typeck.cc b/gcc/c/c-typeck.cc index e55e887da14..7df9de819ed 100644 --- a/gcc/c/c-typeck.cc +++ b/gcc/c/c-typeck.cc @@ -8399,11 +8399,11 @@ digest_init (location_t init_loc, tree type, tree init, tree origtype, pedwarn_init (init_loc, 0, ("initializer-string for array of %qT " "is too long"), typ1); - else if (warn_cxx_compat + else if (warn_unterminated_string_initialization && compare_tree_int (TYPE_SIZE_UNIT (type), len) < 0) - warning_at (init_loc, OPT_Wc___compat, + warning_at (init_loc, OPT_Wunterminated_string_initialization, ("initializer-string for array of %qT " - "is too long for C++"), typ1); + "is too long"), typ1); if (compare_tree_int (TYPE_SIZE_UNIT (type), len) < 0) { unsigned HOST_WIDE_INT size diff --git a/gcc/testsuite/gcc.dg/Wunterminated-string-initialization.c b/gcc/testsuite/gcc.dg/Wunterminated-string-initialization.c new file mode 100644 index 00000000000..13d5dbc6640 --- /dev/null +++ b/gcc/testsuite/gcc.dg/Wunterminated-string-initialization.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-options "-Wunterminated-string-initialization" } */ + +char a1[] = "a"; +char a2[1] = "a"; /* { dg-warning "initializer-string for array of 'char' is too long" } */ +char a3[2] = "a";