exponenta event banner

Правило AUTOSAR C++ 14 M7-5-2

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

Описание

Определение правила

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

Объяснение

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

Внедрение Polyspace

Средство проверки помечает ситуации, когда адрес локальной переменной назначается указателю, определенному в глобальной области.

Проверка не вызывает нарушений этого правила, если:

  • Функция возвращает адрес локальной переменной. AUTOSAR C++14 Rule M7-5-1 охватывает эту ситуацию.

  • Адрес переменной, определенной в области действия блока, назначается указателю, который определен с большей областью действия, но не с глобальной областью действия.

    Например:

     void foobar ( void )
      {
        char * ptr;
        {
          char var;
          ptr = &var;
        }
      }
    Нарушение правила возникает только в том случае, если указатель определен в глобальной области. Например, средство проверки правил помечает назначение здесь:
    char * ptr;
    void foobar ( void )
      {
          char var;
          ptr = &var;
      }

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

Примеры

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

char * ptr;
 
void foo (void) {
    char varInFoo;
    ptr = &varInFoo; //Noncompliant
}

void bar (void) {
    char varInBar = *ptr;
}

void main() {
    foo();
    bar();
}

Назначение ptr = &varInFoo не соответствует, поскольку глобальный указатель ptr может быть обособлено вне функции foo, где переменная varInFoo больше не входит в область действия. Например, в этом примере ptr в функции не используется bar, который вызывается после foo завершает выполнение.

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

Группа: Объявление
Категория: Обязательные, неавтоматические
Представлен в R2020b