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 Desktop.

См. примеры исправлений ниже.

Если вы не хотите устранять проблему, добавьте комментарии к своему результату или коду, чтобы избежать другой проверки. Смотрите Адрес Результаты 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
Влияние: Низкое
ИДЕНТИФИКАТОР CWE: 665, 683
Введенный в R2015b