Это действительно переполнение буфера? - PullRequest
3 голосов
/ 16 февраля 2009

Инструмент статического анализа, который мы используем, помечает C-код, подобный следующему, как критическое переполнение буфера.

#define size 64
char  buf [size + 1] = "";
memset (buf, 0, size + 1);

Сообщение об ошибке инструмента: Переполнение буфера (Индекс массива выходит за границы): размер массива 'buf' равен 1. Массив 'buf' может использовать индекс 0..64.

Это законно? Приводит ли присвоение массива символов к пустой строке в действительности, его длина уменьшается до одного байта, как если бы он был определен как char buf [] = "";?

Ответы [ 4 ]

12 голосов
/ 16 февраля 2009

Помимо того факта, что 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);

Я верю, что Роб Кеннеди прав; ваш инструмент использует значение инициализатора пустой строки в качестве размера массива, а не объявление статического массива.

5 голосов
/ 17 февраля 2009

Назначение "" для buf [size + 1] не сбрасывает размер buf, но это бессмысленно, поскольку дублирует небольшую часть того, что делает последующий memset (и это сбивает с толку инструмент статического анализа - вы можете хотите подать отчет об ошибке)

4 голосов
/ 17 февраля 2009

Это не переполнение буфера.

Это, вероятно, более чистый способ сделать это. Конечно, это занимает меньше строк кода.

#define size 64
char buf[size + 1] = {0};
0 голосов
/ 16 февраля 2009

Это законно - буфер достаточно большой. Инструмент предупреждает вас, что size_t может быть больше, чем int, и попытка использовать его в качестве индексатора может привести к непредсказуемым результатам.

...