【问题标题】:Removing C6054 error with scanf functions使用 scanf 函数删除 C6054 错误
【发布时间】:2016-03-30 20:54:00
【问题描述】:

我在 VS2012 上使用代码分析(又名 FxCop),我有一些表单功能

void ReadTable(FILE *fd)
{
    char label[32];
    /* ... */
    fscanf(fd, "%s", label);
    /* ... */
    if (strcmp(label, "TEST") == 0)
    {
        /* ... */
    }
}

这些总是抛出 warning C6054: String 'label' might not be zero-terminated. 我理解为什么会发生这种情况,因为它们不能使用 SAL 注释来指示来自 fscanf 的输出将以空值终止,但事实仍然存在。

有没有办法摆脱这个警告(不禁用相关的代码分析检查批发)?还是我在使用scanf 时必须忍受的?

【问题讨论】:

  • @user3121023 我现在正在使用该测试进行编译(这需要一段时间),但即使可行,它也不是一个真正可扩展的解决方案,尤其是在 label 是动态分配。

标签: c fxcop


【解决方案1】:

如果 scanf 失败,缓冲区保持未初始化。用户可以输入超过 32 个字符,书写越界。在任何一种情况下,缓冲区都不会以 null 终止。

首先正确初始化缓冲区:

char label[32] = { 0 };

然后确保您最多读取 31 个字符并检查调用的返回值:

const int read = fscanf( fd , "%31s" , label );
if( read <= 0 )
{
    //didn't read anything, check feof and ferror
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-25
    • 2022-01-07
    • 2014-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-03
    • 2016-07-27
    相关资源
    最近更新 更多