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: Требуется