Правило 18.6 MISRA C:2012

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

Описание

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

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

Объяснение

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

Реализация 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 g(unsigned short *p){
    sp = p;  /* Non-compliant 
              * the parameter u from f is copied to static sp */
}

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

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

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

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