小技巧:解决C4996警告的一种方法

小技巧:解决C4996警告的一种方法

作者:BlogUpdater |  时间:2017-08-30 |  浏览:2511 |  评论已关闭 条评论

问题:
当我们使用如下的方式调用std::copy函数时:
std::copy(pointer1, pointer1 + size, pointer2);

编译期会给出如下的警告:
warning C4996: ‘std::_Copy_impl’: Function call with parameters that may be unsafe – this call relies on the caller to check that the passed values are correct.

出现这样的警告的原因:
Visual C++默认使用Checked Interators以避免缓冲器溢出,以提高代码安全性。
所谓Checked Interators,实际上是一款增强版迭代器。通过使用Checked Interators,程序在尝试访问容器的边界(越界访问)时,会自动调用invalid_parameter_handler导致程序退出,此举可以帮助开发人员尽可能早的发现错误。
在上面的代码中,直接使用了指针而不是Checked Interators,如果调用者使用精心构造的参数就可能导致访问越界,最终出现远程代码执行漏洞。
所以,编译期给出了警告。

解决方法:
如果明确知道自己在做什么,可以使用如下的方法安全的避免此警告:
在包含STL头文件之前,定义如下宏:
#define _SCL_SECURE_NO_WARNINGS

标签:

评论已关闭。