exponenta event banner

MISRA C:2012 Правило 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.

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

Группа: указатели и массивы
Категория: Обязательно
Категория СМЖЛ: требуется