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