Почему G CC жалуется только на неподписанный аргумент int, используемый с% i, когда задано -pedanti c? - PullRequest
2 голосов
/ 29 февраля 2020

sscanf(3) говорит (выделено мое):

i
Соответствует целому числу со знаком; следующий указатель должен быть указателем на int. Целое число читается в основании 16, если оно начинается с 0x или 0X, в основании 8, если оно начинается с 0, и в основании 10 в противном случае. Используются только символы, соответствующие основанию.

Однако G CC не жалуется на использование unsigned int с %i, если не указано -pedantic. Это отличается от поведения, к которому я привык, когда G CC будет предупреждать о любой несовпадающей строке типа и формата.

Почему эта комбинация ведет себя по-разному?

Учитывая, что это предупреждение не входит в общий набор -Wall предупреждений, допустимо ли передавать unsigned int в %i?


Пример программы:

#include <stdio.h>

int main(void)
{
    int i;
    unsigned int u;
    float f;

    scanf("%i", &i);
    scanf("%i", &u);
    scanf("%i", &f);

    return 0;
}

Без -pedantic, G CC жалуется на %i и float *, но не unsigned int *:

$ gcc -Wall -Wextra scanf_i.c 
scanf_i.c: In function ‘main’:
scanf_i.c:11:13: warning: format ‘%i’ expects argument of type ‘int *’, but argument 2 has type ‘float *’ [-Wformat=]
     scanf("%i", &f);
            ~^   ~~
            %e

С -pedantic, G CC жалуется на оба: Выход с -pedantic:

$ gcc -Wall -Wextra -pedantic scanf_i.c 
scanf_i.c: In function ‘main’:
scanf_i.c:10:13: warning: format ‘%i’ expects argument of type ‘int *’, but argument 2 has type ‘unsigned int *’ [-Wformat=]
     scanf("%i", &u);
            ~^   ~~
            %i
scanf_i.c:11:13: warning: format ‘%i’ expects argument of type ‘int *’, but argument 2 has type ‘float *’ [-Wformat=]
     scanf("%i", &f);
            ~^   ~~
            %e

G CC версия:

$ gcc --version
gcc (Debian 8.3.0-6) 8.3.0

1 Ответ

2 голосов
/ 29 февраля 2020

-Wformat-signedness управляет выдачей предупреждений, когда тип аргумента отличается только по подписи от ожидаемого.

На справочной странице g cc (1) :

-Wformat-signedness
Если задано -Wformat, также предупредить, если для строки формата требуется беззнаковый аргумент, а аргумент подписан, и наоборот.

На странице руководства явно не указано, что этот флаг включен в -pedantic, (-Wpedantic), но в нем говорится:

Однако, если -Wpedantic используется с -Wformat выдаются предупреждения о возможностях форматирования, отличных от выбранной стандартной версии.

...