Логическая операция требует оценки обоих операндов из-за их порядка, что приводит к неэффективному коду
Этот дефект возникает, когда все эти условия верны:
Левый и правый операнды не имеют побочных эффектов.
Правый операнд не содержит никаких вызовов для const
представители.
Левый операнд содержит один или несколько вызовов для const
представители.
При оценке возможных побочных эффектов операнда:
Polyspace® принимает, что const
Представители функции класса не имеют побочных эффектов. Функции, не являющиеся членами, приняты с побочными эффектами.
Polyspace обрабатывает операции с плавающей точкой в соответствии со стандартом C++. В C++ 03 или более ранних версиях операции с плавающей точкой не имеют побочных эффектов. В C + 11 или более поздней версии операции с плавающей точкой могут иметь побочные эффекты, такие как изменение флагов состояния с плавающей точкой для указания ненормальных результатов или вспомогательной информации. См. «окружение с плавающей точкой».
Polyspace обрабатывает bool
оператор преобразования и логический NOT
операторы struct
или класс как встроенные операторы. Эти операции не рассматриваются как представитель вызовы функций. Стандартная библиотека шаблонов содержит много классов, которые определяют такое bool
оператор преобразования или логический NOT
оператор.
При оценке логической операции компилятор сначала оценивает левый аргумент, а затем оценивает правый аргумент только при необходимости. В логической операции неэффективно помещать вызовы функций в качестве левого аргумента, ставя константы и переменные в качестве правого аргумента. Рассмотрим этот код:
if(Object.attribute()|| var1){ //... }
if
оператор, компилятор всегда оценивает вызов функции Object.attribute()
. Оценка функции не всегда необходима. Для образца, если var1
вычисляет, чтобы true
, тогда логическое выражение всегда вычисляется как true. Потому что var1
является правым операндом, а не левым операндом, компилятор излишне оценивает вызов функции, что неэффективно. Поскольку неэффективный код компилируется и ведет себя правильно, этот дефект может остаться незамеченным.Чтобы исправить этот дефект, разверните порядок операндов в логическом выражении, если левый операнд не выполняет операцию, которая должна быть выполнена перед правым операндом, чтобы безопасно и правильно вычислить правый операнд.
Если это условие не соответствует true, то код опирается на точный порядок, в котором компилятор оценивает отмеченное логическое выражение. Лучшая практика - не полагаться на порядок оценки выражения. Рассмотрите рефакторинг своего кода, чтобы порядок оценки не оказал влияния. Если рефакторинг кода невозможен, разъясните дефект с помощью аннотации или просмотрите информацию. Смотрите Адрес Результаты Polyspace через исправления ошибок или обоснования.
Эффективность улучшения могут варьироваться в зависимости от используемого компилятора, реализации библиотеки и окружения.
Группа: Эффективность |
Язык: C++ |
По умолчанию: Off |
Синтаксис командной строки
: EXPENSIVE_LOGICAL_OPERATION |
Влияние: Средний |