MISRA C:2012 Rule 18.6

Адрес объекта с автоматическим хранением не должен быть скопирован в другой объект, который сохраняется после того, как первый объект прекратил существование

Описание

Управляйте определением

Адрес объекта с автоматическим хранением не должен быть скопирован в другой объект, который сохраняется после того, как первый объект прекратил существование.

Объяснение

Адрес объекта становится неопределенным, когда время жизни того объекта истекает. Любое использование неопределенного адреса приводит к неопределенному поведению.

Реализация Polyspace

Polyspace® отмечает нарушение при присвоении адреса глобальной переменной, возврате адреса локальной переменной или возврате адреса параметра.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

Примеры

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

char *func(void){
    char local_auto;
    return &local_auto ; /* Non-compliant 
                         * &local_auto is indeterminate */
}

В этом примере, потому что local_auto локальная переменная, после того, как функция возвратится, адрес local_auto неопределенно.

char *sp;

void f(unsigned short u){
    g(&u);
}

void h(void){
    static unsigned short *q;
    
    unsigned short x =0u;
    q = &x;  /* Non-compliant - 
              * &x stored in object with greater lifetime */
}

В этом примере, функциональном h хранит адрес локальной переменной x в статическая переменная q. Время жизни статической переменной q сохраняется после времени жизни локальной переменной x концы. Копирование x в q несовместимо с этим правилом, и Polyspace отмечает переменную x.

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

Группа: указатели и массивы
Категория: необходимый
Категория AGC: необходимый