Вопрос

Инструмент статического анализа, который мы используем, помечает 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, и попытка использовать его в качестве индексатора может привести к непредсказуемым результатам.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top