Incorrect pointer scaling

Неявное масштабирование в адресной арифметике с указателями может быть проигнорировано

Описание

Этот дефект происходит, когда Polyspace® Bug Finder™ полагает, что вы игнорируете неявное масштабирование в адресной арифметике с указателями.

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

СитуацияРискВозможная фиксация
Вы используете sizeof оператор в арифметических операциях на указателе.

sizeof оператор возвращает размер типа данных в количестве байтов.

Адресная арифметика с указателями уже неявно масштабируется размером типа данных резкой переменной. Поэтому использование sizeof в адресной арифметике с указателями приводит к непреднамеренным результатам.

Не используйте sizeof оператор в адресной арифметике с указателями.
Вы выполняете арифметические операции на указателе, и затем применяете бросок.Адресная арифметика с указателями неявно масштабируется. Если вы не полагаете, что это неявное масштабирование, бросая результат адресной арифметики с указателями приводит к непреднамеренным результатам.Примените бросок перед адресной арифметикой с указателями.

Фиксация

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

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

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

Примеры

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

void func(void) {
    int arr[5] = {1,2,3,4,5};
    int *ptr = arr;

    int value_in_position_2 = *(ptr + 2*(sizeof(int)));
}

В этом примере, операции 2*(sizeof(int)) возвращает дважды размер int переменная в байтах. Однако, потому что адресная арифметика с указателями неявно масштабируется, количество байтов который ptr возмещен 2*(sizeof(int))*(sizeof(int)).

В этом примере неправильное масштабирование переключает ptr вне границ массива. Поэтому ошибка Pointer access out of bounds появляется на * операция.

Коррекция — удаляет sizeof Оператор

Одна возможная коррекция должна удалить sizeof оператор.

void func(void) {
    int arr[5] = {1,2,3,4,5};
    int *ptr = arr;

    int value_in_position_2 = *(ptr + 2);
}
int func(void) {
    int x = 0;
    char r = *(char *)(&x + 1);
    return r;
}

В этом примере, операции &x + 1 смещения &x sizeof(int). После операции получившийся указатель указывает вне позволенного буфера. Когда вы разыменовываете указатель, ошибка Pointer access out of bounds появляется на * операция.

Коррекция — применяет бросок перед адресной арифметикой с указателями

Если вы хотите получить доступ к второму байту x, сначала бросьте &x к char* указатель и затем выполняет адресную арифметику с указателями. Получившийся указатель возмещен sizeof(char) байты и неподвижные точки в позволенном буфере, размером которого является sizeof(int) байты.

int func(void) {
    int x = 0;
    char r = *((char *)(&x )+ 1);
    return r;
}

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

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