【发布时间】:2022-05-17 12:04:47
【问题描述】:
由于使用 scanf() 函数,我在 Visual Studio 中遇到此 C4996 错误。
原来解决这个问题的方法是在配置属性 -> C/C++ -> 预处理器 -> 预处理器定义 -> 编辑中添加行_CRT_SECURE_NO_WARNINGS。
它完美地解决了这个问题,但我找不到这个东西的实际含义的正确解释。 如果它禁用警告,为什么我的程序首先崩溃了? 什么是“CRT”?
一个崩溃程序的例子:
#include <stdio.h>
main()
{
int number;
printf("enter a number\n");
scanf("%d", &number);
}
【问题讨论】:
-
CRT 是 C 运行时库。
_CRT_SECURE_NO_WARNINGS表示您不希望编译器建议库函数的安全版本,例如scanf_s当你使用scanf时。 -
MSVC 希望您通过使用他们的
scanf_s等来使用它自己的据称更安全的函数版本,例如scanf。但它们使用起来同样棘手,而且它们不是直接的替代品(他们的论点不同),所以可以说他们并不安全。而且它们是非标准的。该定义禁止编译器“警告”。 -
scanf is risky。 MSVC 更喜欢您使用 C11 Annex K 标准提供的替代方案。参数是相同的,并且通过要求格式化字符串指定缓冲区大小更安全。还有一个标准,尽管图书馆作者可以忽略它。他们没有,他们的图书馆长期受到攻击。
-
@HansPassant
scanf并不比 C 的其余部分风险更大:也就是说,如果使用得当,它是完全安全的。事实上,如果您对字符串使用常量格式字符串和长度说明符并且不使用 %n,它可能比 C 的其余部分更安全。
标签: c visual-studio warnings