Обратная совместимость и безопасные версии функций - PullRequest
0 голосов
/ 09 января 2019

Я пишу некоторые программы на C (редко на C ++). Обычно они простые, но часто они могут стать больше.

Я хочу узнать больше об использовании безопасных версий функций, например, strcpy() небезопасен, а strcpy_s() - новая безопасная версия Microsoft этой функции.

Обычно я использую Visual Studio 2010 при кодировании для Windows * Я удалил часть о Linux - сосредоточиться только на Windows *

У меня вопрос: если я использую более новую безопасную версию, смогу ли я выполнять свои программы в более старых версиях Windows, например Windows 95? Из-за требований у нас может быть только один исполняемый файл.

Спасибо.

EDIT: Извините, это только что появилось у меня в голове - игнорируйте часть Linux выше. Если мы пишем код для Windows, я не возражаю, если он не переносим в Linux, мне важно только, работает ли он на старых версиях Windows.

Ответы [ 3 ]

0 голосов
/ 09 января 2019

strcpy совершенно безопасно, см. это .

strcpy_s был стандартизирован только в конце 2011 года в дополнительном интерфейсе проверки границ C11. Он вообще не поддерживается многими компиляторами - новая библиотека потерпела фиаско.

Нестандартные библиотеки Microsoft только частично совместимы со стандартным интерфейсом проверки границ. В некоторых случаях они не соответствуют стандарту, но имеют одинаковое имя функции.

Таким образом, функции, оканчивающиеся на _s, обычно небезопасны , поскольку существуют как стандартные, так и нестандартные версии и не обязательно совместимы. Они, конечно, не переносимы.

Я советую полностью избегать следующего:

  • Интерфейс проверки границ C11.
  • Любая функция, заканчивающаяся _s.
  • Visual Studio с целью компиляции кода на Си.

Вместо этого используйте безопасную и портативную функцию strcpy, которая была стандартизирована и документирована более 30 лет. Вместе с этим вы должны использовать совместимый со стандартом ISO C компилятор.

0 голосов
/ 09 января 2019

У меня вопрос: смогу ли я использовать более новую безопасную версию? выполнить мои программы на старых версиях Windows, например Windows 95? Из-за требований у нас может быть только один исполняемый файл файл.

Версии _s не являются «безопасными», независимо от того, говорите ли вы о реализациях Microsoft или реализациях, соответствующих действующему стандарту. Они включают в себя механизмы, предназначенные для того, чтобы помочь избежать или смягчить некоторые программные ошибки, которые имеют последствия для безопасности, но их эффективность ограничена.

Но относительно того, будут ли они поддерживаться на очень старых версиях Windows, нет, не по умолчанию. Функции _s не существовали при жизни Windows 95, поэтому версии библиотеки времени выполнения C, распространяемые с этой версией Windows, не поддерживают их. Тем не менее, довольно распространено, чтобы приложения Windows были упакованы с версией библиотеки времени выполнения MS C, которая поддерживает их потребности. Возможно, вы можете пойти по этому пути, но я не могу сказать, существует ли какая-либо версия среды выполнения MS C, которая поддерживает все версии Windows за последние 24 года и содержит функции _s.

Лучше всего ограничить себя функциями из стандартной библиотеки C90, функциями WinAPI, поддерживаемыми во всех целевых версиях Windows, а также функциями, предоставляемыми самим приложением и любыми сторонними библиотеками, распространяемыми с ним (которые сами должны соответствовать те же ограничения). Или вы можете ограничить поддержку меньшим количеством версий Windows. Сама Microsoft не поддерживала Windows 95 в течение 18 лет.

0 голосов
/ 09 января 2019

Избегайте strcpy_s(), если вы хотите написать portable C (или C ++), поскольку это нестандартная функция.

strncpy() является стандартным способом копирования до определенного количества символов и может помочь предотвратить переполнение буфера, при котором используется термин «безопасность».

Нет ничего плохого в использовании strcpy, если вы знаете, что делаете. Большая часть этого чувства относится к C в целом: его сила заключается в его простоте и минимальной проверке во время выполнения.

...