Действительно ли это переполнение буфера?
-
23-08-2019 - |
Вопрос
Инструмент статического анализа, который мы используем, помечает C-код, подобный следующему, как критическое переполнение буфера.
#define size 64
char buf [size + 1] = "";
memset (buf, 0, size + 1);
Сообщение об ошибке инструмента выглядит следующим образом: Переполнение буфера (Индекс массива выходит за пределы):Размер массива 'buf' равен 1.Массив 'buf' может использовать индекс 0..64.
Законно ли это?Действительно ли присвоение массива символов пустой строке приводит к тому, что ее длина уменьшается до одного байта, как если бы она была определена как char buf [] = "";
?
Решение
Присвоение "" buf[size + 1] не приводит к сбросу размера buf, но это бессмысленно, поскольку дублирует небольшую часть того, что делает последующий memset (и это сбивает с толку ваш инструмент статического анализа - возможно, вы захотите отправить отчет об ошибке против него).
Другие советы
Помимо того факта, что char buf[size + 1] не будет компилироваться, потому что size - это значение времени выполнения, предполагая, что вы могли бы создать buf как массив размера 65, тогда memset(buf, 0, 65) не был бы переполнением.
Скорее всего, ваш инструмент сбит с толку вашими синтаксическими проблемами.
[Править:дополнительная информация]
Основываясь на комментариях к моему первоначальному сообщению, я предлагаю следующее:
#define size 64
char buf[size+1];
strcpy(buf, "");
memset(buf, 0, size+1);
Я верю, что Роб Кеннеди прав;ваш инструмент использует значение инициализатора пустой строки в качестве размера массива, а не объявление статического массива.
Это не переполнение буфера.
Вероятно, это более чистый способ сделать это.Конечно, это занимает меньше строк кода.
#define size 64
char buf[size + 1] = {0};
Это законно - буфер достаточно большой.Инструмент предупреждает вас, что size_t может быть больше, чем int, и попытка использовать его в качестве индексатора может привести к непредсказуемым результатам.