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