GCC 不会抛出警告并编译错误代码

GCC 不会抛出警告并编译错误代码
#include <stdio.h>

int main() {
  printf("Enter your name\n");
  char name[99];
  scanf("%d", name);
  printf("Hello %s\n", name);
}

在执行这个简单的程序时,我错误地使用 %d%s.但是当我使用 编译代码时gcc,它没有显示任何警告。它只是创建了一个输出文件。

$ gcc greet.c
$ ls
greet.c a.out
$ 

而使用 编译此代码确实clang会显示警告。我非常确定应该像不传递任何参数gcc一样显示警告。 我最近从 Ubuntu 切换到 Debian,我不知道这是否是由于缺少某些依赖项造成的。clang

一些附加信息

GCC version : gcc (Debian 8.3.0-6) 8.3.0
OS : Debian 10(Buster)

答案1

在 GCC 上,格式字符串检查由以下命令控制-Wformat,默认情况下不启用。

-Wformat使用(或-Wall,包含它)构建代码会发出警告:

$ gcc -Wformat    630368.c   -o 630368
630368.c: In function ‘main’:
630368.c:6:16: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’ [-Wformat=]
        scanf("%d", name);
               ~^   ~~~~
               %hhd

(使用 GCC 8),或

$ gcc -Wformat    630368.c   -o 630368
630368.c: In function ‘main’:
630368.c:6:16: warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type ‘char *’ [-Wformat=]
    6 |        scanf("%d", name);
      |               ~^   ~~~~
      |                |   |
      |                |   char *
      |                int *
      |               %hhd

(与海湾合作委员会 10)。

-WformatUbuntu 附带的 GCC 具有默认启用的自定义规范;看gcc -dumpspecs

*distro_defaults:
%{!fno-asynchronous-unwind-tables:-fasynchronous-unwind-tables} %{!fno-stack-protector:%{!fstack-protector-all:%{!ffreestanding:%{!nostdlib:%{!fstack-protector:-fstack-protector-strong}}}}} %{!Wformat:%{!Wformat=2:%{!Wformat=0:%{!Wall:-Wformat} %{!Wno-format-security:-Wformat-security}}}} %{!fno-stack-clash-protection:-fstack-clash-protection} %{!fcf-protection*:%{!fno-cf-protection:-fcf-protection}}

(尤其%{!Wformat:%{!Wformat=2:%{!Wformat=0:%{!Wall:-Wformat} %{!Wno-format-security:-Wformat-security}}}})。

相关内容