exponenta event banner

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

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

Описание

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

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

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

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

    При присвоении адреса 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