Перевернутые аргументы в 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 заключается в том, что она позволит вам делать больше или меньше того, что вы хотите, даже если то, что вы хотите, - плохая идея.