Перевернутые аргументы в scanf()

Я (быстро) написал код и случайно перевернул аргументы в scanf():

char i[] = "ABC1\t";
scanf(i, "%s");

Компиляция с помощью gcc -Werror -Wall -Wextra не жалуется на этот бит. Очевидно, что этот код не работает, но почему gcc не сообщил мне, что я перевернул аргументы? Не может ли он обнаружить, что i не является строкой формата или что второй аргумент не является типом хранилища?

ИЗМЕНИТЬ
Спасибо, что поняли все. Похоже, я нашел ответ, был фальсифицирован флаг -Wformat, который делает это "захватывающим" (размещенное ниже для справки)

Ответ 1

Ха! Я нашел это. Удар gcc с флагом -Wformat=2 поймал его.

Размещение информации для других:

Здесь список найденных флагов

-Wformat Check calls to printf and scanf, etc., to make sure that the arguments supplied have types appropriate to the format string specified...

Я предположил, что -Wall имел -Wformat в нем, что он и делает, но действительно важную роль в том, что я только что нашел:

-Wformat is included in -Wall. For more control over some aspects of format checking, the options -Wformat-y2k, -Wno-format-extra-args, -Wno-format-zero-length, -Wformat-nonliteral, -Wformat-security, and -Wformat=2 are available, but are not included in -Wall.

Ответ 2

Я полагаю, это не должно быть.

int scanf ( const char * format, ... );

i обычно преобразовывался в const char*, все остальные параметры были просто "эллипсисом" и не могут быть проверены во время компиляции.

Ответ 3

Ручная запись для scanf (man scanf) дает прототип:

int scanf(const char *format, ...);

A char [] - это особый тип char *, поэтому первый аргумент выполняется. Вторичные аргументы оцениваются во время выполнения (если я помню), поэтому они даже не рассматриваются компилятором здесь. Из перспективы компилятора это прекрасный вызов функции, заданной ее прототипом.

Кроме того, компилятор никогда не проверяет, пытаетесь ли вы писать в неверные местоположения. Великая (или ужасная) вещь о C заключается в том, что она позволит вам делать больше или меньше того, что вы хотите, даже если то, что вы хотите, - плохая идея.