首页 > 编程知识 正文

错误c49d9188,错误的英文

时间:2023-05-04 19:38:22 阅读:182290 作者:2429

1 .解决方法:在项目处右键单击找到属性;

单击属性进行设置;

单击C/C在右侧找到SDL检查,然后单击右侧的小箭头将其更改为no。

下面这个好像是第二种解决方法

项目--->; 项目属性--->; C/C -->; 预处理程序定义

添加: _CRT_NONSTDC_NO_DEPRECATE和_CRT_SECURE_NO_WARNINGS

不知道为什么之前写的博客内容变了.大家用上面的第一个方法修改就可以了:

# pragma warning (disable :4996 )。

2 .问题原因:创建项目时,系统会选中“安全开发生命周期(SDL )”复选框。 这是微软在VS2012上新推出的,是为了能更好地监督开发者的代码安全。 如果选中此项,将严格按照SDL的规则编译代码,并且以前常用的函数将无法编译。 例如在VS2010中

要在Visual Studio中定义预处理程序宏,请:

打开您的项目属性页的对话框,展开配置属性C/c预处理程序,在中预处理程序中定义属性,然后添加宏名称。 选择“确定”并保存,然后重新生成项目。

要仅在特定源文件中定义宏,请在#define EXAMPLE_MACRO_NAME中的头文件行之前添加一行。

以下内容来源于Microsoft Visual Studio 2017

这些是c运行时库和标准库,但生成的一些常见C4996消息没有详细说明。

:POSIX 函数名称

此项目的POSIX名称已被废除。 请改为使用与ISO C和c匹配的名称: new_name。 有关详细信息,请参阅联机帮助。

Microsoft是CRT中的一部分POSIX函数,它已重命名为符合在C99和c 03规则实现中定义的全局函数名称。 只废除了原始的POSIX名称,而不是函数本身。 在大多数情况下,为了创建符合标准的名称,在POSIX函数名称中添加了下划线。 编译器是发出销毁警告的原始函数的名称,建议使用首选名称。

要解决此问题,通常建议您更改代码以使用推荐的函数名称。 但是,更新的名称是Microsoft特定的。 如果出于可移植性的原因需要使用现有函数名称,则可以关闭这些警告。 原始名称下的库的POSIX函数现在仍然有效。

要关闭这些函数的销毁警告,请定义预处理程序宏_CRT_NONSTDC_NO_WARNINGS。 可以在命令行/D_CRT_NONSTDC_NO_WARNINGS中定义此宏,包括选项。

:不安全的 CRT 库函数

此函数或变量可能不安全。 请考虑相反使用safe_version。 要禁用销毁,请使用_CRT_SECURE_NO_WARNINGS。 有关详细信息,请参阅联机帮助。 为了支持更多的安全版本,Microsoft取消了某些CRT和c标准库函数和全局变量。

在大多数情况下,如果允许未选择的读取或写入权限,被丢弃的函数将允许导致严重安全问题的缓冲区。

编译器警告丢弃这些函数,并推荐首选函数。 要解决此问题,建议使用函数或变量safe_version的逆。

如果代码中没有显示缓冲区复盖或overread,并且验证了无法更改的代码可移植性的原因,则可以关闭警告。 要关闭CRT中这些函数的销毁警告,请定义_CRT_SECURE_NO_WARNINGS。 要关闭有关放弃的全局变量的警告,请定义_ CRT _ secure _ no _ warnings _ globals。

有关这些不推荐的函数和全局变量的详细信息,请参阅CRT安全功能和安全库: C标准库

:不安全的标准库函数

STD : function _ name : _如果选择此选项,则在STD : _ deprecate中调用function _ name 要禁用此警告,请使用-D_SCL_SECURE_NO_WARNINGS。 有关使用Visual c Checked Iterators的信息,请参阅文档

调试版本会显示此警告,因为某些c标准库模板函数不检查参数是否正确。 这是因为在许多情况下,没有足够的信息来检查容器边界,或者可能错误地使用迭代器。 此警告有助于确定这些函数的用途,因为它可能会导致程序中的严重安全漏洞。 详情请参照CheckedIterators

例如,如果在调试模式下传递的元素指针std:copy不是普通数组,而是std:copy,则会显示此警告。 要解决此问题,请使用正确声明的数组。 因此,库可以检查数组扩展磁盘空间并执行边界检查。

//compile with : cl/c/w4/d _ debugc 4996 _ copy array。

cpp#include <algorithm>void example(char const * const src) { char dest[1234]; char * pdest3 = dest + 3; std::copy(src, src + 42, pdest3); // C4996 std::copy(src, src + 42, dest); // OK, copy can tell that dest is 1234 elements } ```

多个标准库算法已更新,可以在 C + + 14 中有"双范围"版本。

如果您使用双范围版本,第二个范围提供了必要的边界检查: ```// C4996_containers.cpp // compile
with: cl /c /W4 /D_DEBUG C4996_containers.cpp
#include

bool example(
char const * const left,
const size_t leftSize,
char const * const right,
const size_t rightSize) {
bool result = false;
result = std::equal(left, left + leftSize, right); // C4996
// To fix, try this form instead:
// result = std::equal(left, left + leftSize, right, right + rightSize); // OK
return result; } ```

此示例演示几个标准库可用于检查迭代器使用情况的更多方法和未选中状态的使用情况可能存在危险:

C4996_standard.cpp#include <algorithm>#include <array>#include <iostream>#include <iterator>#include <numeric>#include <string>#include <vector>using namespace std;template <typename C> void print(const string& s, const C& c) { cout << s; for (const auto& e : c) { cout << e << " "; } cout << endl; }int main() { vector<int> v(16); iota(v.begin(), v.end(), 0); print("v: ", v); // OK: vector::iterator is checked in debug mode // (i.e. an overrun triggers a debug assertion) vector<int> v2(16); transform(v.begin(), v.end(), v2.begin(), [](int n) { return n * 2; }); print("v2: ", v2); // OK: back_insert_iterator is marked as checked in debug mode // (i.e. an overrun is impossible) vector<int> v3; transform(v.begin(), v.end(), back_inserter(v3), [](int n) { return n * 3; }); print("v3: ", v3); // OK: array::iterator is checked in debug mode // (i.e. an overrun triggers a debug assertion) array<int, 16> a4; transform(v.begin(), v.end(), a4.begin(), [](int n) { return n * 4; }); print("a4: ", a4); // OK: Raw arrays are checked in debug mode // (i.e. an overrun triggers a debug assertion) // NOTE: This applies only when raw arrays are // given to C++ Standard Library algorithms! int a5[16]; transform(v.begin(), v.end(), a5, [](int n) { return n * 5; }); print("a5: ", a5); // WARNING C4996: Pointers cannot be checked in debug mode // (i.e. an overrun triggers undefined behavior) int a6[16]; int * p6 = a6; transform(v.begin(), v.end(), p6, [](int n) { return n * 6; }); print("a6: ", a6); // OK: stdext::checked_array_iterator is checked in debug mode // (i.e. an overrun triggers a debug assertion) int a7[16]; int * p7 = a7; transform(v.begin(), v.end(), stdext::make_checked_array_iterator(p7, 16), [](int n) { return n * 7; }); print("a7: ", a7); // WARNING SILENCED: stdext::unchecked_array_iterator // is marked as checked in debug mode, but it performs no checking, // so an overrun triggers undefined behavior int a8[16]; int * p8 = a8; transform( v.begin(), v.end(), stdext::make_unchecked_array_iterator(p8), [](int n) { return n * 8; }); print("a8: ", a8); } ``

如果已验证您的代码不能具有缓冲区溢出错误在标准库函数,触发此警告,你可能想要关闭此警告。 若要关闭这些函数的警告,定义 _SCL_SECURE_NO_WARNINGS。

4:已过时的 CRT 函数和变量
此函数或变量已被较新的库或操作系统功能。请考虑使用 new_item相反。请参阅联机帮助了解详细信息。某些库函数和全局变量由于过时已弃用。 可能会在未来版本的库中删除这些函数和变量。编译器会发出对这些项的弃用警告,并建议首选备用项。   若要解决此问题,我们建议更改代码以使用建议的函数或变量。若要关闭这些项的弃用警告,定义 _CRT_过时_NO_WARNINGS。 有关详细信息,请参阅弃用的函数或变量的文档。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。