exponenta event banner

Правило AUTOSAR C++ 14 A5-16-1

Троичный условный оператор не должен использоваться в качестве подэкспрессии

Описание

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

Троичный условный оператор не должен использоваться в качестве подэкспрессии.

Объяснение

Троичный условный оператор, используемый в качестве подэкспрессии, делает полное выражение менее читаемым и трудно поддерживаемым. Часто визуально более ясно, если присвоить результат троичного оператора переменной, а затем использовать переменную в последующих операциях.

Внедрение Polyspace

Флажок checker использует троичный условный оператор во вложенных выражениях с некоторыми исключениями. Исключения включают использование оператора в следующих случаях:

  • Результат присваивается переменной.

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

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

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

Примеры

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

#include <cstdint>
const int ULIM = 100000;

std::int32_t foo(int32_t x) {
    int ret;
    ret = (x <= 0? 0: (x >= ULIM? 0 : x)); //Noncompliant
    return ret;
}

std::int32_t bar(int32_t x) {
    int ret, retInterim;
    retInterim = x >= ULIM? 0 : x; //Compliant
    ret = retInterim <= 0? 0 : retInterim; //Compliant
    return ret;
}

В этом примере в foo, троичная условная операция связывается со второй операцией для возврата значения 0, если x находится в диапазоне [0, ULIM] и возвращение x в противном случае. Сравнение троичной операции x с ULIM является подэкспрессией в полной цепочке и нарушает правило.

В bar, каждая троичная условная операция записывается отдельным шагом и не нарушает правило. Альтернативно, тот же самый алгоритм может быть реализован объединением условий с логическим оператором И и использованием одной троичной условной операции.

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

Группа: Выражения
Категория: Обязательно, Автоматизировано
Представлен в R2019b