Одинаковые части условий в разных условиях блока "Если ИначеЕсли"
Совпадающие части условий во взаимоисключающих условиях часто говорят об ошибке. Также такие совпадения встречаются в сложных условиях. Нередко подобные проблемы возникают при дублировании кода.
Эти дублирующиеся условия могут приводить к проблемам производительности, т.к. возможно повторное вычисление значений, в т.ч. и сложных, тяжелых - обращение к БД, чтение файлов и т.п.
Рекомендация - проверьте код на валидность условий. Возможно, есть смысл исправить дублирование условий, переписав или упростив код.
Пример подозрительных условий
Если А = 2 И ОдноУсловие Тогда // дублирование А = 2 выглядит подозрительным
ИначеЕсли А = 2 И ДругоеУсловие Тогда // и здесь
КонецЕсли
такой блок кода лучше упростить
Если А = 2 Тогда
Если ОдноУсловие Тогда
ИначеЕсли ДругоеУсловие Тогда // и здесь
КонецЕсли;
КонецЕсли
Или еще проблемное условие
Если А = 2 Или Б = 3 Тогда // дублирование А = 2 выглядит подозрительным
ИначеЕсли А = 2 И В = 1 Тогда // и здесь
КонецЕсли
Возможны более сложные условия, которые легко не упростить.
Например:
Если ПродублированноеУсловие И ОдноУсловие Тогда // использование "ПродублированноеУсловие" выглядит подозрительным
еслиБлок();
ИначеЕсли ПродублированноеУсловие И Не ОдноУсловие Тогда
иначеЕслиБлок();
Иначе
иначеБлок();
КонецЕсли
Согласно Common Weakness Enumeration потенциальные ошибки, найденные с помощью этой диагностики, классифицируются как - CWE-570 - CWE-571
См. также
- Правило Одинаковые условия в последовательности вида "Если (....) ИначеЕсли (....) ИначеЕсли (....)".
- Правило Дублирование одинаковых/похожих блоков кода
- Правило Совпадающие/одинаковые тела методов
- MSC12-C. Detect and remove code that has no effect or is never executed
- MITRE, CWE-489 - Leftover Debug Code
- MITRE, CWE-570 - Expression is Always False
- MITRE, CWE-571 - Expression is Always True
- MISRA C:2004, 13.7 - Boolean operations whose results are invariant shall not be permitted.
- MISRA C:2012, 14.3 - Controlling expressions shall not be invariant
Экранирование кода
// sonar:EqualSubConditions:off
// sonar:EqualSubConditions:on