exponenta event banner

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

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

Зафиксировать

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

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

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

Примеры

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

#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++
По умолчанию: Откл.
Синтаксис командной строки: MEMSET_INVALID_VALUE
Воздействие: Низкий
CWE ID: 665, 683
Представлен в R2015b