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

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

Описание

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

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

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

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

    Если вы присваиваете адрес указателю 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