Ошибка SystemC при использовании Visual C++ 2008

Я использую systemC с Visual C++ 2008. Я написал простую программу hello world. Однако я неоднократно получаю эту ошибку:

предупреждение C4996: 'sprintf': эта функция или переменная могут быть небезопасными.

Почему это происходит? Буду признателен за любую помощь.


person newbie    schedule 28.01.2012    source источник
comment
Это предупреждение, а не ошибка.   -  person Philippe    schedule 31.01.2012


Ответы (2)


Компилятор предостерегает от использования sprintf(), поскольку это может привести к переполнению буфера, поскольку он не проверяет предел буфера. Вместо этого используйте snprintf(), который никогда не заполняет буфер сверх переданного предела.

Этот совет также содержится на справочной странице:

Поскольку sprintf() и vsprintf() предполагают произвольно длинную строку, вызывающие программы должны быть осторожны, чтобы не переполнить реальное пространство; это часто невозможно гарантировать. Обратите внимание, что длина создаваемых строк зависит от локали и ее трудно предсказать. Вместо этого используйте snprintf() и vsnprintf() (или asprintf(3) и vasprintf(3)).

person Adam Zalcman    schedule 28.01.2012
comment
в этом часто невозможно убедиться, только если ты идиот. Люди, которые достаточно долго программировали на C, знают разницу между действительно небезопасными вещами (такими как gets или scanf("%s"), где вы не контролируете ввод) и такими вещами, как sprintf, где вы можете сделать это безопасным. Всем остальным следует вернуться к использованию VB :-) Я всегда отключаю эти предупреждения с помощью #define, так как я знаю, что делаю. - person paxdiablo; 28.01.2012
comment
Я согласен с тем, что gets() и sprintf() попадают в разные категории, когда речь идет о потенциальных уязвимостях, но есть опасность использования sprintf(), о которой вы не упомянули и которая связана с обслуживанием: легко забыть обновить размер буфера при изменении строка формата или другие параметры, переданные в sprintf(). - person Adam Zalcman; 28.01.2012

Это небезопасно, потому что - из MSDN

Невозможно ограничить количество записываемых символов, а это означает, что код, использующий sprintf, подвержен переполнению буфера. Рассмотрите возможность использования связанной функции _snprintf, которая указывает максимальное количество символов, которые должны быть записаны в буфер, или используйте _scprintf, чтобы определить, насколько большой требуется буфер. Кроме того, убедитесь, что формат не является определяемой пользователем строкой.

person Mahesh    schedule 28.01.2012
comment
Это не небезопасно, это может быть небезопасно. - person ta.speot.is; 28.01.2012
comment
Да, это небезопасно, только если вы не знаете, что делаете. - person paxdiablo; 28.01.2012
comment
@skeptic: спасибо всем лучше всего выразить, щелкнув контур флажка слева от ответа. - person Johnsyweb; 25.04.2012