Вызовите к memset с непреднамеренным значением

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

Описание

Вызов memset с непреднамеренным значением происходит, когда 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)).

Фиксация

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

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

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

Примеры

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

#include <string.h>

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

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

Исправление — применяет бросок

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

#include <string.h>

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

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

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

Введенный в R2015b