AUTOSAR C++14 Rule M0-1-4

Проект не должен содержать энергонезависимые переменные POD, имеющие только одно использование.

Описание

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

Проект не должен содержать энергонезависимые переменные POD, имеющие только одно использование.

Объяснение

Если вы используете энергонезависимую переменную с Простым Типом данных (int'double', и т.д.), только однажды, можно заменить переменную на постоянный литерал. Ваше использование переменной указывает, что вы предназначили больше чем одно использование для той переменной и можете иметь программную ошибку в коде. Вы можете не использовать другое использование энергонезависимой переменной или неправильно использовать другие переменные в намеченных точках использования.

Реализация Polyspace

Средство проверки отмечает локальные и статические переменные, которые имеют функциональный осциллограф (локально статический) и осциллограф файла, которые используются только однажды. Средство проверки рассматривает const- квалифицированные глобальные переменные без extern спецификатор как статические переменные с осциллографом файла.

Средство проверки считает эти варианты использования как одно использование энергонезависимой переменной:

  • Явная инициализация с помощью постоянного литерала или возвращаемого значения функции

  • Присвоение

  • Ссылка на переменную, такую как операция чтения

  • Присвоение переменного адреса к указателю

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

Некоторые объекты спроектированы, чтобы использоваться только однажды их семантикой. Polyspace® не отмечает одно использование этих объектов:

  • lock_guard

  • scoped_lock

  • shared_lock

  • unique_lock

  • thread

  • future

  • shared_future

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

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

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

Примеры

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

#include <mutex>
int readStatus1();
int readStatus2();
extern std::mutex m;
void foo()
{
    // Initiating lock 'lk'
    std::lock_guard<std::mutex> lk{m};   
    int checkEngineStatus1 = readStatus1();
    int checkEngineStatus2 = readStatus2();//Noncompliant

    if(checkEngineStatus1) {
        //Perform some actions if both statuses are valid   
    }
    // Release lock when 'lk' is deleted at exit point of scope
}

В этом примере, переменной checkEngineStatus2 используется только однажды. Одно использование этой переменной силы указывает на программную ошибку. Например, вы можете намереваться проверять оба checkEngineStatus1 и checkEngineStatus2 в if условие, но не использованный вторая проверка. lock_guard объект lk также используется только однажды. Поскольку семантика lock_guard объект выравнивает по ширине свое одно использование, Polyspace не отмечает его.

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

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