exponenta event banner

Absolute address usage

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

Описание

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

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

  • Адрес допустим.

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

    Если вы присваиваете адрес 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 не используется. Поэтому проверка Absolute address usage является зеленой когда указатель p присвоен абсолютный адрес.

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

  • В if(myType == CHAR) перейдите, оранжевый Overflow происходит потому что 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 используется. Проверка Absolute address usage является оранжевой когда указатель p присвоен абсолютный адрес.

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

  • Polyspace® рассматривает тот p точки к допустимой ячейке памяти. Поэтому Illegally dereferenced pointer начинает работу, следующая линия является зеленой.

  • В следующих двух линиях, указатель p постепенно увеличивается и затем разыменовывается. В этом случае проверка Illegally dereferenced pointer появляется на разыменовывании и не проверке Absolute address usage даже при том, что p неподвижные точки к абсолютному адресу.

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

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