Логическая операция требует оценки обоих операндов из-за их порядка, приводящего к неэффективному коду
Этот дефект происходит, когда все эти условия верны:
Левые и правые операнды не имеют никаких побочных эффектов.
Правильный операнд не содержит вызовов 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
, затем логическое выражение всегда оценивает к истине. Поскольку var1
правильный операнд, не левый операнд, компилятор излишне оценивает вызов функции, который неэффективен. Поскольку неэффективный код компилирует и ведет себя правильно, эта дефектная сила остаются незамеченными.Чтобы зафиксировать этот дефект, инвертируйте порядок операндов в логическом выражении, если левый операнд не выполняет операцию, которая должна быть выполнена перед правильным операндом для того, чтобы оценить правильный операнд безопасно и правильно.
Если это условие не верно, то код использует точный порядок, в котором компилятор выполняет отмеченное логическое выражение. Лучшая практика не состоит в том, чтобы использовать порядок оценки выражения. Рассмотрите рефакторинг вашего кода так, чтобы порядок оценки не оказывал влияния. Если рефакторинг кода не возможен, выровняйте по ширине дефект при помощи аннотации или рассмотрите информацию. Смотрите Результаты Polyspace Адреса Через Исправления ошибок или Выравнивания.
Повышения производительности могут варьироваться на основе компилятора, реализации библиотеки и среды, которую вы используете.
Группа: Производительность |
Язык: C++ |
Значение по умолчанию: Off |
Синтаксис командной строки:
EXPENSIVE_LOGICAL_OPERATION |
Удар: Средняя |