CERT C++: EXP46-C

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

Описание

Управляйте определением

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

Реализация Polyspace

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

Примеры

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

Проблема

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

  • Поразрядный AND (&, &=)

  • Битовое "ИЛИ" (|, |=)

  • Поразрядный XOR (^, ^=)

  • Битовое "НЕ" (~)

с:

  • Булевы переменные типа

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

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

Риск

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

Фиксация

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

Пример — возможная ошибка из-за Использования побитового оператора
class User{
	//...
	int uid;
	int euid;
public:
	int getuid();
	int geteuid();
};
void Noncompliant ()
{
	User nU;
	if (nU.getuid () & nU.geteuid () == 0) {   //Noncompliant
		//...
	}else{
		//...
	}
}

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

Коррекция — использует логические операторы с Подобными булевской переменной операндами

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

class User{
	//...
	int uid;
	int euid;
public:
	int getuid();
	int geteuid();
};
void Noncompliant ()
{
	User nU;
	if (nU.getuid () && nU.geteuid () == 0) {   //Compliant
		//...
	}else{
		//...
	}
}

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

Группа: 02. Выражения (EXP)
Введенный в R2019a

[1]  Это программное обеспечение было создано MathWorks, включающим фрагменты: “Веб-сайт SEI CERT-C”, © 2017 Carnegie Mellon University, веб-сайт SEI CERT-C © 2017 Carnegie Mellon University”, CERT SEI C Кодирование Стандарта – Правил для Разработки безопасных, Надежных и Защищенных систем – 2 016 Выпусков”, © 2016 Carnegie Mellon University, and “CERT SEI Стандарт Кодирования C++ – Правил для Разработки безопасных, Надежных и Защищенных систем на C++ – 2 016 Выпусков” © 2016 Carnegie Mellon University, со специальным разрешением от его Института программной инженерии.

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

Это программное обеспечение и сопоставленная документация не были рассмотрены, ни являются подтвержденным Университетом Карнеги-Меллон или его Институтом программной инженерии.