Call to memset with unintended value

memset или wmemset используемый с возможно неправильными аргументами

Описание

Этот дефект происходит, когда Polyspace® Bug Finder™ обнаруживает использование memset или wmemset функция с возможно неправильными аргументами.

void *memset (void *ptr, int value, size_t num) заполняет первый num байты блока памяти, что ptr точки к с заданным value. Если аргумент value является неправильным, блок памяти инициализируется непреднамеренным значением.

Непреднамеренная инициализация может произойти в следующих случаях.

ПроблемаРискВозможная фиксация
Вторым аргументом является '0' вместо 0 или '\0'.Значение ASCII символьного '0' 48 (десятичное число), 0x30 (шестнадцатеричный), 069 (восьмеричный), но не 0 (или '\0') .Если вы хотите инициализировать '0', используйте одно из значений ASCII. В противном случае используйте 0 или '\0'.
Вторые и третьи аргументы, вероятно, инвертируются. Например, третий аргумент является литералом, и второй аргумент не является литералом.Если порядок инвертируется, блок памяти непреднамеренного размера инициализируется неправильными аргументами.Инвертируйте порядок аргументов.
Второй аргумент не может быть представлен в байте.Если второй аргумент не может быть представлен в байте, и вы ожидаете, что каждый байт блока памяти будет заполнен тем аргументом, инициализация не происходит, как предназначено.

Примените немного маски к аргументу, чтобы привести к перенесенному или усеченному результату, который может быть представлен в байте. Когда вы применяете немного маски, убедитесь, что она производит ожидаемый результат.

Например, замените memset(a, -13, sizeof(a)) с memset(a, (-13) & 0xFF, sizeof(a)).

Фиксация

Фиксация зависит от первопричины дефекта. Часто детали результата показывают последовательность событий, которые привели к дефекту. Можно реализовать закрепление на любом событии в последовательности. Если детали результата не показывают историю события, можно проследить использование, щелкните правой кнопкой по опциям по исходному коду и смотрите предыдущие связанные события. См. также Интерпретируют Результаты Bug Finder в Пользовательском интерфейсе Рабочего стола Polyspace.

Смотрите примеры мер ниже.

Если вы не хотите устранять проблему, добавьте комментарии в свой результат или код, чтобы избежать другого анализа. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.

Примеры

развернуть все

#include <string.h>

#define SIZE 32
void func(void) {
    char buf[SIZE];
    int c = -2;
    memset(buf, (char)c, sizeof(buf));
}

В этом примере, (char)c не может быть представлен в байте.

Коррекция — применяет бросок

Одна возможная коррекция должна применить бросок так, чтобы результат мог быть представлен в байте. Проверяйте, что результатом броска является приемлемое значение инициализации. В этой коррекции Polyspace не повышает этот дефект. Бросок от int со знаком к unsigned char противоречит лучшым практикам, и Polyspace повышает дефектный Sign change integer conversion overflow.

#include <string.h>

#define SIZE 32
void func(void) {
    char buf[SIZE   ];
    int c = -2;
    memset(buf, (unsigned char)c, sizeof(buf));// Might Overflow 
}
Коррекция — избегает использования memset

Одна возможная коррекция должна зарезервировать использование memset только для установки или очистки всех битов в буфере. Например, в этом коде, memset называется, чтобы очистить биты символьного массива buf.

#include <string.h>

#define SIZE 32
void func(void) {
    char buf[SIZE   ];
    int c = -2;
    memset(buf, 0, sizeof(buf));//Compliant 
	/* After clearing buf, use it in operations*/
}

Информация о результате

Группа: Программирование
Язык: C | C++
Значение по умолчанию: Off
Синтаксис командной строки: MEMSET_INVALID_VALUE
Удар: низко
ID CWE: 665, 683
Введенный в R2015b