MISRA C++:2008 Rule 0-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 условие, но опускает вторую проверку. The lock_guard lk объекта также используется только один раз. Потому что семантика lock_guard объект оправдывает свое единичное использование, Polyspace не помечает его.

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

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