Нужно ли использовать функцию scanf_s вместо обычной scanf?

В книгах примеры программ используют функцию scanf, однако при запуске программы в Visual Studio я получаю ошибку: 'scanf': This function or variable may be unsafe. Вам предлагается использовать scanf_s вместо этого. Кроме того, для отключения предупреждений рекомендуется использовать директиву #define _CRT_SECURE_NO_WARNINGS. Я понимаю, что могу избавиться от этой ошибки, добавив указанный #define, но возникнут ли какие-либо негативные последствия от этого решения?
  • 11 января 2025 г. 14:03
Ответы на вопрос 2
Использование `scanf_s` вместо обычного `scanf` в Visual Studio связано с улучшениями безопасности, предусмотренными в Microsoft C Runtime Library. `scanf_s` является более безопасной версией `scanf`, потому что она требует от вас указывать размеры буферов, что помогает избежать переполнений буфера, которые могут привести к уязвимостям в программе.

Вот основные моменты, которые следует учитывать:

1. **Безопасность**: `scanf_s` требует указания размера буфера для строкового ввода. Это помогает предотвратить переполнение буфера, которое может быть использовано злоумышленниками для выполнения атак, таких как выполнение произвольного кода.

2. **Совместимость**: Если вы добавите `#define _CRT_SECURE_NO_WARNINGS`, вы сможете избежать предупреждений и использовать `scanf` без изменений. Однако это не решит проблему безопасности. Если вы планируете использовать ваш код в продуктивной среде или в проекте, где безопасность важна, лучше использовать `scanf_s`.

3. **Кросс-платформенность**: Однако стоит отметить, что `scanf_s` — это специфичная для Microsoft расширенная версия функции, и код, использующий ее, может не компилироваться в других компиляторах без модификации. Если вы планируете переносить код на другие платформы, возможно, стоит использовать стандартные функции и избегать `scanf_s`.

4. **Упрощение кода**: Использование `scanf` с отключением предупреждений упрощает код, но повышает риск. Если ваш код не требует строгой безопасности, это может быть приемлемым временным решением. Однако в любом случае лучше привести код в соответствие со стандартами безопасности.

В общем, рекомендуется использовать `scanf_s` или аналогичные функции, которые предоставляют механизмы безопасности, если вы работаете в Visual Studio. Если же в вашем проекте нет строгих требований по безопасности или требования к совместимости с другими платформами, использование `#define _CRT_SECURE_NO_WARNINGS` может быть допустимым.
Ответ легко ищется поисковиком. 
https://www.cyberforum.ru/c-beginners/thread101856...

ссылаясь на ошибку

Не ошибка, а предупреждение.

но не проведёт ли это к каким-то последствиям?

Можно случайно словить неприятную ошибку в рантайме, если будешь невнимательно пользоваться scanf

scanf - стандартная функция, которая работает ровно так, как написано в доке и в твоей книге.
scanf_s - то же самое, но нужно ещё передать размер буфера - перед записью, функция внутри проверит, что данные укладываются в переданных размер.
https://en.cppreference.com/w/c/io/fscanf
Но обрати внимание на:

As with all bounds-checked functions, scanf_s, fscanf_s, and sscanf_s are only guaranteed to be available if __STDC_LIB_EXT1__ is defined by the implementation and if the user defines __STDC_WANT_LIB_EXT1__ to the integer constant 1 before including .
Похожие вопросы