【问题标题】:What does _CRT_SECURE_NO_WARNINGS actually mean?_CRT_SECURE_NO_WARNINGS 实际上是什么意思?
【发布时间】: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


【解决方案1】:

Windows 中的CRT is the C Runtime Library 为您提供scanf 等功能,Linux 中由GNU LibC (GLibc) 完成。

正如@jamieguinan 指出的那样,scanf 存在一些安全漏洞,例如缓冲区溢出,其中用户提供的输入可能大于缓冲区的大小,从而导致它在其他内存中被覆盖。

这就是 Visual Studio 警告您使用scanf_s 的原因,它是scanf 的更安全版本。

您可以将此预处理器定义放入您的代码中以禁用此警告:

#define _CRT_SECURE_NO_WARNINGS

如果你真的知道自己在做什么,那就没有必要了。

【讨论】:

    猜你喜欢
    • 2018-08-08
    • 1970-01-01
    • 2020-02-15
    • 2021-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多