From patchwork Sun Oct 10 23:10:20 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Daniil Stas X-Patchwork-Id: 46050 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id B5C6D385843B for ; Sun, 10 Oct 2021 23:11:06 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org B5C6D385843B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1633907466; bh=hH/hITVQC8OhB9PvU1f9M0X4WfRJME51blg/0SnDdhg=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=cE1cNyyBN8pb7h7DjbKk1RyhSzbe0S5dgGd3TjihDeaBBMoVJiP1B3Mp9nrmAI0W6 kYefQGTz1+U1VQ/vJEIBVYeGSz9F1tO73eqaGXqfSxgbu0U6Mw+MLv5Vh2skLSb2Bl D2uy+I6UU5jEG2b6F7omZ/8SOqVC9oNv9KpoyMW0= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mout02.posteo.de (mout02.posteo.de [185.67.36.66]) by sourceware.org (Postfix) with ESMTPS id 77CC03858D28 for ; Sun, 10 Oct 2021 23:10:36 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 77CC03858D28 Received: from submission (posteo.de [89.146.220.130]) by mout02.posteo.de (Postfix) with ESMTPS id AC0C5240104 for ; Mon, 11 Oct 2021 01:10:34 +0200 (CEST) Received: from customer (localhost [127.0.0.1]) by submission (posteo.de) with ESMTPSA id 4HSHhn59ppz9rxG; Mon, 11 Oct 2021 01:10:33 +0200 (CEST) To: gcc-patches@gcc.gnu.org Subject: [PATCH v2] c-format: Add -Wformat-int-precision option [PR80060] Date: Sun, 10 Oct 2021 23:10:20 +0000 Message-Id: <20211010231020.762020-1-daniil.stas@posteo.net> In-Reply-To: <6a32d1f5-baf4-0922-96a4-a78b12c432a1@gmail.com> References: <6a32d1f5-baf4-0922-96a4-a78b12c432a1@gmail.com> MIME-Version: 1.0 X-Spam-Status: No, score=-13.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Daniil Stas via Gcc-patches From: Daniil Stas Reply-To: Daniil Stas Cc: Daniil Stas Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" This option is enabled by default when -Wformat option is enabled. A user can specify -Wno-format-int-precision to disable emitting warnings when passing an argument of an incompatible integer type to a 'd', 'i', 'o', 'u', 'x', or 'X' conversion specifier when it has the same precision as the expected type. Signed-off-by: Daniil Stas gcc/c-family/ChangeLog: * c-format.c (check_format_types): Don't emit warnings when passing an argument of an incompatible integer type to a 'd', 'i', 'o', 'u', 'x', or 'X' conversion specifier when it has the same precision as the expected type if -Wno-format-int-precision option is specified. * c.opt: Add -Wformat-int-precision option. gcc/ChangeLog: * doc/invoke.texi: Add -Wformat-int-precision option description. gcc/testsuite/ChangeLog: * c-c++-common/Wformat-int-precision-1.c: New test. * c-c++-common/Wformat-int-precision-2.c: New test. --- This is an update of patch "c-format: Add -Wformat-same-precision option [PR80060]". The changes comparing to the first patch version: - changed the option name to -Wformat-int-precision - changed the option description as was suggested by Martin - changed Wformat-int-precision-2.c to used dg-bogus instead of previous invalid syntax I also tried to combine the tests into one file with #pragma GCC diagnostic, but looks like it's not possible. I want to test that when passing just -Wformat option everything works as before my patch by default. And then in another test case to check that passing -Wno-format-int-precision disables the warning. But looks like in GCC you can't toggle the warnings such as -Wno-format-int-precision individually but only can disable the general -Wformat option that will disable all the formatting warnings together, which is not the proper test. gcc/c-family/c-format.c | 2 +- gcc/c-family/c.opt | 6 ++++++ gcc/doc/invoke.texi | 17 ++++++++++++++++- .../c-c++-common/Wformat-int-precision-1.c | 7 +++++++ .../c-c++-common/Wformat-int-precision-2.c | 7 +++++++ 5 files changed, 37 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/Wformat-int-precision-1.c create mode 100644 gcc/testsuite/c-c++-common/Wformat-int-precision-2.c diff --git a/gcc/c-family/c-format.c b/gcc/c-family/c-format.c index ca66c81f716..dd4436929f8 100644 --- a/gcc/c-family/c-format.c +++ b/gcc/c-family/c-format.c @@ -4243,7 +4243,7 @@ check_format_types (const substring_loc &fmt_loc, && (!pedantic || i < 2) && char_type_flag) continue; - if (types->scalar_identity_flag + if ((types->scalar_identity_flag || !warn_format_int_precision) && (TREE_CODE (cur_type) == TREE_CODE (wanted_type) || (INTEGRAL_TYPE_P (cur_type) && INTEGRAL_TYPE_P (wanted_type))) diff --git a/gcc/c-family/c.opt b/gcc/c-family/c.opt index 06457ac739e..f5b4af3f3f6 100644 --- a/gcc/c-family/c.opt +++ b/gcc/c-family/c.opt @@ -660,6 +660,12 @@ C ObjC C++ LTO ObjC++ Warning Alias(Wformat-overflow=, 1, 0) IntegerRange(0, 2) Warn about function calls with format strings that write past the end of the destination region. Same as -Wformat-overflow=1. +Wformat-int-precision +C ObjC C++ ObjC++ Var(warn_format_int_precision) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=,warn_format >= 1, 0) +Warn when passing an argument of an incompatible integer type to a 'd', 'i', +'o', 'u', 'x', or 'X' conversion specifier even when it has the same precision +as the expected type. + Wformat-security C ObjC C++ ObjC++ Var(warn_format_security) Warning LangEnabledBy(C ObjC C++ ObjC++,Wformat=, warn_format >= 2, 0) Warn about possible security problems with format functions. diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 8b3ebcfbc4f..05dec6ba832 100644 --- a/gcc/doc/invoke.texi +++ b/gcc/doc/invoke.texi @@ -348,7 +348,7 @@ Objective-C and Objective-C++ Dialects}. -Werror -Werror=* -Wexpansion-to-defined -Wfatal-errors @gol -Wfloat-conversion -Wfloat-equal -Wformat -Wformat=2 @gol -Wno-format-contains-nul -Wno-format-extra-args @gol --Wformat-nonliteral -Wformat-overflow=@var{n} @gol +-Wformat-nonliteral -Wformat-overflow=@var{n} -Wformat-int-precision @gol -Wformat-security -Wformat-signedness -Wformat-truncation=@var{n} @gol -Wformat-y2k -Wframe-address @gol -Wframe-larger-than=@var{byte-size} -Wno-free-nonheap-object @gol @@ -6056,6 +6056,21 @@ If @option{-Wformat} is specified, also warn if the format string is not a string literal and so cannot be checked, unless the format function takes its format arguments as a @code{va_list}. +@item -Wformat-int-precision +@opindex Wformat-int-precision +@opindex Wno-format-int-precision +Warn when passing an argument of an incompatible integer type to +a @samp{d}, @samp{i}, @samp{o}, @samp{u}, @samp{x}, or @samp{X} conversion +specifier even when it has the same precision as the expected type. +For example, on targets where int64_t is a typedef for long, the warning +is issued for the printf call below even when both long and long long have +the same size and precision. + +@smallexample + extern int64_t n; + printf ("%lli", n); +@end smallexample + @item -Wformat-security @opindex Wformat-security @opindex Wno-format-security diff --git a/gcc/testsuite/c-c++-common/Wformat-int-precision-1.c b/gcc/testsuite/c-c++-common/Wformat-int-precision-1.c new file mode 100644 index 00000000000..fbc11e4200a --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wformat-int-precision-1.c @@ -0,0 +1,7 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-Wformat" } */ + +void test () +{ + __builtin_printf ("%lu\n", (long long) 1); /* { dg-warning "expects argument of type" } */ +} diff --git a/gcc/testsuite/c-c++-common/Wformat-int-precision-2.c b/gcc/testsuite/c-c++-common/Wformat-int-precision-2.c new file mode 100644 index 00000000000..63536bf5ff2 --- /dev/null +++ b/gcc/testsuite/c-c++-common/Wformat-int-precision-2.c @@ -0,0 +1,7 @@ +/* { dg-do compile { target lp64 } } */ +/* { dg-options "-Wformat -Wno-format-int-precision" } */ + +void test () +{ + __builtin_printf ("%lu\n", (long long) 1); /* { dg-bogus "expects argument of type" } */ +}