如何强制 gcc 对非文字格式字符串进行 printf 检查?

问题描述 投票:0回答:1
const char* const non_literal_string = "Hello %d";

void my_print()
{
    /* 
     * I would like GCC to throw a warning when compiling this line because the
     * argument is not of int type.
     */
    printf(non_literal_string, "World!");
    
    //Like it does here
    printf("Hello %d", "World!");
}

上面我已将

non_literal_string
声明为
const char* const
,因此指针和指向的字符串都不能更改,因此 GCC 可以检查提供的参数是否具有适合指定格式字符串的类型。

使用 clang 编译器,即使对非文字格式字符串也会执行这些检查,如果我尝试使用 clang 编译此代码,这就是输出:

<source>:11:32: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
   11 |     printf(non_literal_string, "World!");
      |            ~~~~~~~~~~~~~~~~~~  ^~~~~~~~
<source>:3:47: note: format string is defined here
    3 | const char* const non_literal_string = "Hello %d";
      |                                               ^~
      |                                               %s
<source>:14:24: warning: format specifies type 'int' but the argument has type 'char *' [-Wformat]
   14 |     printf("Hello %d", "World!");
      |                   ~~   ^~~~~~~~
      |                   %s
c gcc clang printf
1个回答
0
投票

如何强制 gcc 对非文字格式字符串进行 printf 检查?

程序不会执行您希望程序执行的操作。 “强迫”gcc 做任何事情的唯一可能的方法就是改变它。您可以修改gcc源代码来进行检查并实现它。您可以将其作为错误或功能请求发布到 gcc bugzilla,并资助 gcc 开发 https://gcc.gnu.org/wiki/GNUToolchainFund .

该功能只是没有实现,它不存在。没有“强迫”。

© www.soinside.com 2019 - 2024. All rights reserved.