Абсолютное использование адреса

Абсолютный адрес назначен указателю

Описание

Эта проверка появляется, когда указателю назначается абсолютный адрес.

По умолчанию этот флажок имеет зеленый цвет. Программное обеспечение предполагает следующее относительно абсолютного адреса:

  • Адрес действителен.

  • Тип указателя, которому присваивается адрес, определяет начальное значение, сохраненное в адресе.

    При присвоении адреса int* , зона памяти, на которую указывает адрес, инициализируется с помощью int значение. Значение может быть любым допустимым для типа данных int.

Чтобы сделать этот флажок оранжевым по умолчанию для каждого абсолютного использования адреса, используйте параметр командной строки -no-assumption-on-absolute-addresses.

Примеры

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

enum typeList {CHAR,INT,LONG};
enum typeList showType(void);
long int returnLong(void);

void main() {
    int *p = (int *)0x32; //Green absolute address usage
    enum typeList myType = showType();

    char x_char;
    int x_int;
    long int x_long;

    if(myType == CHAR)
        x_char = *p;
    else if(myType == INT)
        x_int = *p;
    else {
        x_long = *p;
        long int x2_long = returnLong();
    }
}

В этом примере опция -no-assumption-on-absolute-addresses не используется. Следовательно, проверка использования абсолютного адреса зеленая, когда указатель p назначается абсолютный адрес.

После этой проверки проверка предполагает, что адрес инициализирован с помощью int значение. Если вы используете x86_64 для Target processor type (-target) (sizeof(char) < sizeof(int) < sizeof(long int)), предположение приводит к следующему:

  • В if(myType == CHAR) ветвь, оранжевый Переполнение происходит, потому что x_char не может вместить все значения, разрешенные для int переменная.

  • В else if(myType == INT) ветвь, если поместить курсор на x_int в результатах проверки всплывающая подсказка показывает, что x_int потенциально имеет все значения, допустимые для int переменная.

  • В else ветвь, если поместить курсор на x_long, подсказка показывает, что x_long потенциально имеет все значения, допустимые для int переменная. При установке курсора x2_long, подсказка показывает, что x2_long потенциально имеет все значения, допустимые для long int переменная. Диапазон значений, x2_long может принимать шире, чем значения, допустимые для int переменная в том же целевом объекте.

void main() {
    int *p = (int *)0x32;
    int x = *p;
    p++;
    x = *p;
}

В этом примере опция -no-assumption-on-absolute-addresses используется. Проверка использования абсолютного адреса оранжевая, когда указатель p назначается абсолютный адрес.

После этой проверки:

  • Polyspace ® считает, чтоp указывает на допустимое расположение памяти. Таким образом, проверка указателя «Незаконно» в следующей строке имеет зеленый цвет.

  • В следующих двух строках указатель p увеличивается, а затем удаляется. В этом случае на демереференции появляется проверка нелегального удаления указателя, а не проверка абсолютного использования адреса, несмотря на то, что p по-прежнему указывает на абсолютный адрес.

Проверить информацию

Группа: Статическая память
Язык: C | C++
Акроним: ABS_ADDR