禁用通过_CRT_SECURE_NO_DEPRECATE生成的警告


75

禁用通过生成的警告的最佳方法是什么_CRT_SECURE_NO_DEPRECATE,它可以使警告轻松恢复并在Visual Studio版本中正常工作?

Answers:


105

如果您不想污染您的源代码(仅在使用Microsoft编译器显示所有此警告之后),_CRT_SECURE_NO_WARNINGS请通过“项目”->“属性”->“配置属性”->“ C / C ++”将符号添加到项目设置中“->”预处理器“->”预处理器定义“。

您也可以在包含生成此警告的头文件之前定义它。您应该添加这样的内容

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

并仅需说明一下,请确保您了解此警告的含义,并且,也许,如果您不打算使用MSVC以外的其他编译器,请考虑使用函数的安全版本,例如strcpy_s而不是strcpy。


使用c11和c ++ 11规范,您应该在所有兼容的编译器中使用_s版本的字符串处理例程。
保罗·怀特赫斯特

10
@PaulWhitehurst:不,它们仅在可选扩展名中。
重复数据删除器,2014年

48

您可以使用以下方法暂时禁用警告出现的位置:

#pragma warning(push)
#pragma warning(disable: warning-code) //4996 for _CRT_SECURE_NO_WARNINGS equivalent
// deprecated code here
#pragma warning(pop)

因此您不会禁用所有警告,这有时可能会有害。


2
#pragma warning(supress: warning-code)如果只有一行(以下)使用不推荐使用的函数。
cremno

2
@cremnosuppress有两个p
Gunther Struyf

8

我从事的是多平台项目,所以我不能使用_s函数,也不想用Visual Studio特定的代码污染我的代码。
我的解决方案是在Visual Studio项目上禁用警告4996。转到项目- >属性- >配置属性- > C / C ++ - >高级- >禁用特定的警告增加值4996.
如果你使用也MFC和/或ATL库(不是我的情况)定义之前包括MFC _AFX_SECURE_NO_DEPRECATE和在包括atl _ATL_SECURE_NO_DEPRECATE之前。
我在Visual Studio 2003和2005中使用此解决方案。

ps:如果仅使用Visual Studio,则安全模板重载可能是一个很好的解决方案。


2
这些*_s功能不是Microsoft特定的。它们被称为边界检查接口,并且是C / C ++标准的一部分。参见ISO / IEC TR 24772。Glibc人员决定不实施它们。
jww 2015年

1
“ ...而且我不想用Visual Studio特定的代码污染我的代码”-为什么不使用更安全的功能并避免出现安全漏洞?在Unix和Linux上,您可以提供一个包装器,该包装器执行您应该执行的绑定检查,然后调用Unix或Linux的标准函数。如果您不执行边界检查,那么您确实需要这些功能来避免代码出现问题(至少在Windows上如此)。
jww

6

您还可以使用Secure Template Overloads,它们将帮助您在可能容易推断出缓冲区大小(静态数组)的任何地方用安全调用替换不安全的调用。

只需添加以下内容:

#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 

然后使用_s函数手动修复剩余的警告。


5

@ [macbirdie]和@ [Adrian Borchardt]答案的组合。事实证明,这在生产环境中非常有用(不会弄乱先前存在的警告,尤其是在跨平台编译期间)

#if (_MSC_VER >= 1400)         // Check MSC version
#pragma warning(push)
#pragma warning(disable: 4996) // Disable deprecation
#endif 
//...                          // ...
strcat(base, cat);             // Sample depreciated code
//...                          // ...
#if (_MSC_VER >= 1400)         // Check MSC version
#pragma warning(pop)           // Renable previous depreciations
#endif

3

对于逐个警告的情况,明智的做法是将其恢复为默认值,因为您是逐案进行的。

#pragma warning(disable: 4996) /* Disable deprecation */
// Code that causes it goes here
#pragma warning(default: 4996) /* Restore default */

2

最好的方法是通过简单的检查和评估。我通常会这样:

#ifndef _DEPRECATION_DISABLE   /* One time only */
#define _DEPRECATION_DISABLE   /* Disable deprecation true */
#if (_MSC_VER >= 1400)         /* Check version */
#pragma warning(disable: 4996) /* Disable deprecation */
#endif /* #if defined(NMEA_WIN) && (_MSC_VER >= 1400) */
#endif /* #ifndef _DEPRECATION_DISABLE */

真正需要的是以下内容:

#pragma warning(disable: 4996)

还没让我失望吗?希望这可以帮助


2

您可以禁用安全检查。去

项目->属性->配置属性-> C / C ++->代码生成->安全检查

并选择禁用安全检查(/ GS-)


1

您可以定义_CRT_SECURE_NO_WARNINGS符号以禁止显示它们,并取消定义它以将它们恢复原状。


0

另一个较晚的答案...这是Microsoft在其中使用它的方式wchar.h。请注意,它们还禁用了警告C6386

__inline _CRT_INSECURE_DEPRECATE_MEMORY(wmemcpy_s) wchar_t * __CRTDECL
wmemcpy(_Out_opt_cap_(_N) wchar_t *_S1, _In_opt_count_(_N) const wchar_t *_S2, _In_ size_t _N)
{
    #pragma warning( push )
    #pragma warning( disable : 4996 6386 )
        return (wchar_t *)memcpy(_S1, _S2, _N*sizeof(wchar_t));
    #pragma warning( pop )
} 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.