使用 scanf 函数删除 C6054 错误

Posted

技术标签:

【中文标题】使用 scanf 函数删除 C6054 错误【英文标题】:Removing C6054 error with scanf functions 【发布时间】: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 是动态分配。 【参考方案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

【讨论】:

以上是关于使用 scanf 函数删除 C6054 错误的主要内容,如果未能解决你的问题,请参考以下文章

vs2013/2015中scanf函数类似于error C4996: 'scanf': This function or variable may be unsafe的安全检查错误

scanf 调用时出现“无法打开输出文件”错误

使用 scanf 读取时产生总线错误的程序 - C 程序

c中的函数原型,编译错误

C语言杂谈scanf()scanf_s()与错误 C4996

Linux中scanf类型匹配错误,特指scanf(