Это сообщение от анализатора кода, по-видимому, основано на принципе, что содержимое буфера будет определяться как результат от memset()
. Он пропускает то, что цикл после memset()
завершает этот ввод.
Если вы дважды щелкните предупреждение, вы можете получить выделение строк, рассматриваемых для запуска этого предупреждения.
Но код, который вы пишете, верен, поэтому вам не нужно беспокоиться о результате здесь. Электронная документация говорит «может быть» нет «будет»:
Это предупреждение означает, что машиночитаемый степень указанного буфера может быть меньше, чем индекс, используемый для чтения из него.
Дополнительные замечания:
При принятии того, что происходит на более очевидным для анализатора, она по-прежнему приносит те же оскорбительные предупреждения:
memset(buf, '0', 16);
memset(buf + 16, 0x00, 2); // for replacing the loop
В этом случае анализатор замечает второй memset()
. Но поскольку он не влияет на buf с самого начала, он как вход/выход в буферную операцию без учета дополнительной длины.
Даже этот вид более-precautiononous код поднимает предупреждение:
memset(buf, 0x00, sizeof(buf)); // completeky initalize the buffer
memset(buf, '0', 16); // overwrite just the beginning
Здесь, кажется, что как только memxxx()
операция цели Бегин буфера, длина этой операции считается подошва инициализированная часть.
Итак, да предупреждение раздражает, но доверяйте своему коду. Я мог бы только избавиться от предупреждения, сделав действительно странно в unefficient кодирования:
memset(buf, 0x00, sizeof(buf)); // 18 bytes get initalized
memset(buf + 1, '0', 15); // not begin of buffer
buf[0] = '0'; // not a memxxx() operation
К сожалению, конфигурация анализатора не позволяет отключить только это одно правило, но и весь набор правил проверки безопасности.
Пожалуйста, предоставьте предупреждение. Кроме того, какой компилятор? – Barry
Невозможно воспроизвести, я не вижу никаких предупреждений. Расскажите, пожалуйста, ваши параметры компилятора + версии + (или какой-либо инструмент, созданный предупреждением). Http: //coliru.stacked-crooked.com/a/90211ae6e2daa5c7 –
И, кстати, есть ли веская причина, почему вы не используете 'std :: vector'? –