使用 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的安全检查错误