GCC는 경고를 발생시키지 않고 잘못된 코드를 컴파일합니다.

GCC는 경고를 발생시키지 않고 잘못된 코드를 컴파일합니다.
#include <stdio.h>

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

이 간단한 프로그램을 실행 하다가 실수 로 %d. 단지 출력 파일을 생성합니다.%sgcc

$ 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

(GCC 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}}}}).

관련 정보