Как использовать 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.

Другие вопросы по тегам