Устранение ошибки C6054 с помощью функций scanf
Я использую Code Analysis (он же FxCop) на VS2012, и у меня есть несколько функций вида
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 ответ
Если 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
}