Когда компилятор смотрит на строку форматирования scanf
, он видит строку! Это при условии, что строка форматирования не вводится во время выполнения. Некоторые компиляторы, такие как GCC, имеют некоторые дополнительные функции для анализа строки форматирования, если она введена во время компиляции. Эта дополнительная функциональность не является исчерпывающей, потому что в некоторых ситуациях требуются накладные расходы во время выполнения, что является НЕТ НЕТ для языков, таких как C. Например, вы можете обнаружить небезопасное использование, не вставляя дополнительный скрытый код в этом случае:
char* str;
size_t size;
scanf("%z", &size);
str = malloc(size);
scanf("%9s"); // how can the compiler determine if this is a safe call?!
Конечно, есть способы написать безопасный код с помощью scanf
, если указать число символов для чтения и достаточно памяти для хранения строки. В случае gets
невозможно указать количество символов для чтения.