Как использовать fopen_s, когда мне нужно запросить путь к файлу?
Я использовал, чтобы сделать fopen более безопасным с этим кодом
fin = fopen(ifp, "r");
fout = fopen(ofp, "w");
if ((fin == NULL)||(fout == NULL))
printf ("Error opening files");
else {} //action
Теперь я перешел на Microsoft Visual Studio 2013. Он просит меня использовать fopen_s вместо fopen. Есть ли какое-либо решение, кроме использования _CRT_SECURE_NO_WARNINGS? Я имею в виду, совместим ли факт ввода пути к файлу (scanf) с fopen_s? Или просто забыть об этом и отключить предупреждения безопасности?
PS Я знаю, что ввод пути к файлу может быть небезопасным, но я просто должен сделать это так, потому что это указано в моей задаче.
1 ответ
Я не думаю, что это делает это безопаснее. Это просто хорошая обработка условий и того, что вы должны делать. Наверное, стоит проверить errno
тоже.
При этом, если у вас есть возможность использовать fopen_s
тогда я бы этим воспользовался. Из MSDN о " улучшениях безопасности":
Проверка параметров. Параметры, передаваемые в функции CRT, проверяются как в защищенных функциях, так и во многих существующих версиях функций. Эти проверки включают в себя:
Проверка значений NULL, переданных в функции.
Проверка перечисленных значений на достоверность.
Проверка того, что интегральные значения находятся в допустимых диапазонах.
Для получения дополнительной информации см. Проверка параметров.
Обработчик недопустимых параметров также доступен разработчику. При обнаружении неверного параметра вместо утверждения и выхода из приложения CRT предоставляет способ проверить эти проблемы с помощью функции _set_invalid_parameter_handler.
Размерные буферы. Безопасные функции требуют, чтобы размер буфера передавался любой функции, которая пишет в буфер. Защищенные версии подтверждают, что буфер достаточно велик перед записью в него, что помогает избежать опасных ошибок переполнения буфера, которые могут привести к выполнению вредоносного кода. Эти функции обычно возвращают код ошибки типа errno и вызывают некорректный обработчик параметра, если размер буфера слишком мал. Функции, которые читают из входных буферов, например, получает, имеют безопасные версии, которые требуют, чтобы вы указали максимальный размер.
Нулевое окончание Некоторые функции, которые оставили потенциально не завершенные строки, имеют безопасные версии, которые гарантируют, что строки должным образом завершаются нулем.
Улучшенная отчетность об ошибках. Безопасные функции возвращают коды ошибок с большим количеством информации об ошибках, чем было доступно с ранее существовавшими функциями. Защищенные функции и многие из ранее существующих функций теперь устанавливают errno и часто также возвращают тип кода errno, чтобы обеспечить лучший отчет об ошибках.
Безопасность файловой системы. API безопасного ввода-вывода файлов поддерживают безопасный доступ к файлам в случае по умолчанию.
Безопасность Windows. API-интерфейсы безопасного процесса обеспечивают соблюдение политик безопасности и позволяют указывать списки ACL.
Проверка синтаксиса форматной строки. Недопустимые строки обнаруживаются, например, с использованием неправильных символов поля типа в строках формата printf.