使用scanf函数删除C6054错误

时间:2016-03-30 20:54:01

标签: c fxcop

我在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时必须忍受的事情?

1 个答案:

答案 0 :(得分:2)

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

首先正确初始化缓冲区:

char label[32] = { 0 };

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

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