MISRA C++:2008 Rule 0-1-4

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

Описание

Примечание

Используйте Bug Finder вместо Code Prover для проверки правил кодирования. Поддержка кодирования правил, регистрируясь в Code Prover будет удалена в будущем релизе. См. Вопросы совместимости.

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

Проект не должен содержать энергонезависимые переменные 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 не отмечает его.

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

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

Вопросы совместимости

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

Не рекомендуемый запуск в R2021b

Введенный в R2020b