Задействование заблокированных стандартных функций в Visual Studio

В Visual Studio 2015 и 2017 по умолчанию блокируется работа некоторых стандартные функций. К примеру, strcat, strncat, strcpy и strncpy в языке С++. Вместо них Microsoft теперь предлагает использовать свои эквиваленты вида strcat_s. Данное нововведение является следствием политики Microsoft на усиление безопасности. Они создали методику разработки безопасных программ под названием Security Development Lifecycle (SDL) (Wiki), которая и блокирует использование потенциально небезопасного кода. В данной статье показано, как можно продолжить запускать код, написанный по общепринятому стандарту.

Если разные мнения, стоит ли подстраиваться под нововведение или использовать общепринятый стандарт, обеспечивая безопасность за счёт грамотного проектирования кода. В данной статье это разбираться не будет. Я лишь покажу, как в последних Visual Studio можно запустить код со стандартными функциями, который вы, к примеру, скопировали из CodeBlocks или интернет-страницы.

Прежде всего, вы должны хорошо понимать, что именно вы запускаете. Автор данной статьи не несёт никакой ответственности, если вы, запустив на своём компьютере недоброкачественный код, в результате что-то себе повредите. Вы изменяете выставленные по умолчанию настройки безопасности на свой страх и риск. Все скриншоты сделаны с VS2017. В VS2015 эти вещи идентичны, но могут быть свои особенности.

Способов нами обнаружено четыре. Первые три из них относятся к проектам, созданным через "Visual C++ > Windows Desktop > ...":

1)
Перейти в свойства проекта:
Выбор в контекстном меню элемента Свойства

Затем отключить General > SDL checks. Что приводит к прописыванию в командной строке компилятора параметра /sdl-.
Отключение SDL сhecks

Если не запустится, то присмотритесь, что у вас выставлено в распрывающемся списке Solution Configurations. Там должен быть Release (а не Debug). Раскрывающийся список находится под главным меню.
Список Solution Configuration, выставленный на Release

 

2)
Второй способ делается на это же самом окне, но отключаем другую опцию:
Code Generation > Security Check. В результате в командной строке компилятора появляется /GS-.
Отключение Security Check

Точно также, как и в предыдущем случае, проследите, чтобы Solution Configurations был выставлен на Release.

Достаточно отключить лишь один из данных двух параметров.

 

3)
Прописать в заголовке программы директиву:
#pragma warning (disable:4996)

Данную директиву необходимо прописать после всех #include<...>, иначе не заработает. В этой директиве цифры '4996' обозначают код предупреждения, которое компилятор должен проигнорировать при сборке проекта. Если точное копирование данной директивы не помогает, то изучите сообщение, выводимое при компиляции (панель Output) - возможно, запустить программу мешает предупреждение с другим номером, его тоже можно отключить. Но помните, что делаете вы это на свой страх и риск.

В некоторых местах можно встретить рекомендацию использовать директиву
#define _SCL_SECURE_NO_WARNINGS
или прописать её в параметрах проекта. У меня эти способы не получились.

 

4)
Четвёртый способ. При создании проекта выбирать путь не
Visual C++ > Windows Desktop > ... , а
Visual C++ > CLR > ...

При этом способе предупреждение при сборке также выдаётся, но по-умолчанию игнорируется.

 

(Статья написана в качестве подведения результатов обсуждения, имевшего место в нашем внутреннем чате.)


P.S.
Первые два из предложенных способов не срабатывают, если мы захотим использовать команду
getch() из библиотеки <cstdio>, которую в Visual Studio полагается записывать как _getch(). Однако работают два последних.

Add new comment

Plain text

  • No HTML tags allowed.
  • Lines and paragraphs break automatically.
  • Web page addresses and email addresses turn into links automatically.