exponenta event banner

CERT C: EXP46-C правил

Не используйте побитовый оператор с логическим операндом

Описание

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

Не используйте побитовый оператор с булевым операндом. [1 ]

Внедрение Polyspace

Эта проверка проверяет использование побитового оператора с булевым операндом.

Примеры

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

Проблема

Использование побитового оператора с булевым операндом происходит при использовании побитовых операторов, таких как:

  • Побитовое И (&, &=)

  • Побитовое ИЛИ (|, |=)

  • Побитовый XOR (^, ^=)

  • Побитовый НЕ (~)

с:

  • Переменные логического типа

  • Выходные данные реляционных выражений или выражений равенства

Использование переменных логического типа в качестве индексов массива в логическом арифметическом выражении и в операциях сдвига не приводит к возникновению этого дефекта.

Риск

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

Зафиксировать

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

Пример - Возможная ошибка из-за использования оператора Bitwise
int getuid();
int geteuid();
void Noncompliant ()
{
	if (getuid () & geteuid () == 0) {/*Noncompliant*/   
		/* ... */
	}else{
		/*...*/
	}
}

В этом примере if-else блок выполняется условно. Условный оператор использует побитовое И (&) вместо логического И (&&), возможно, по ошибке. Учитывайте, когда функция geteuid() вычисляется как 0, и getuid() вычисляется как 2. В этом случае else блок кода выполняется при использовании & потому что 2&1 вычисляется как false. И наоборот, if блок кода выполняется при использовании && потому что 2&&1 вычисляется как true. Используя & вместо && может привести к логическим ошибкам и ошибкам в коде, которые трудно найти. Polyspace ® помечает использование побитовых операторов в этих видах выражений, где также используются реляционные операторы.

Исправление - использование логических операторов с логическими операндами

Одной из возможных корректировок является использование логических операторов в выражениях, содержащих реляционные операторы и логические переменные.

int getuid();
int geteuid();
void Compliant ()
{
	if (getuid () && geteuid () == 0) {   
		/* ... */
	}else{
		/*...*/
	}
}

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

Группа: Правило 03. Выражения (EXP)
Представлен в R2019a

[1] Данное программное обеспечение было создано компанией MathWorks и включает в себя следующие компоненты: «Веб-сайт SEI CERT-C», © 2017 Университет Карнеги-Меллон, веб-сайт SEI CERT-C + + © 2017 Университет Карнеги-Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги-Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОНА И/ИЛИ ЕГО ПРОГРАММНОГО ИНЖЕНЕРНОГО ИНСТИТУТА, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ КАК ЕСТЬ. УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБЫХ ВОПРОСОВ, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИИ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ ТОВАРНОЙ ПРИГОДНОСТИ, ИСКЛЮЧИТЕЛЬНОСТИ ИЛИ РЕЗУЛЬТАТОВ, ПОЛУЧЕННЫХ ОТ ИСПОЛЬЗОВАНИЯ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Данное программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллона или его Институтом разработки программного обеспечения.