MISRA C++:2008 Rule 5-14-1

Правый операнд логического && или || оператор не должен содержать побочные эффекты

Описание

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

Правый операнд логического && или || оператор не должен содержать побочные эффекты.

Объяснение

Когда оценено, выражение с побочным эффектом изменяет по крайней мере одну из переменных в выражении. Например, n++ выражение с побочным эффектом.

Правый операнд a:

  • Логический оператор оценен, только если левый операнд оценивает к истине.

  • Логический || оператор оценен, только если левый операнд оценивает ко лжи.

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

Реализация Polyspace

Средство проверки отмечает логический && или || операторы, правильные операнды которых являются выражениями, которые имеют побочные эффекты. Polyspace® принимает:

  • Выражения, который изменяет по крайней мере одну из его переменных, имеют побочные эффекты.

  • Явные конструкторы или функции преобразования, которые объявлены, но не заданы, не имеют никаких побочных эффектов. Заданные функции преобразования имеют побочные эффекты.

  • Энергозависимые доступы и вызовы функции не имеют никаких побочных эффектов.

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, относитесь, чтобы Диагностировать, Почему Кодирующие Стандартные Нарушения Не Появляются как ожидалось.

Примеры

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

class real32_T {
public:
	real32_T() = default;

	/* Casting operations */
	explicit real32_T(float a) {
		// ...
	}
	/* Relational operators */
	bool operator==(real32_T a) const;
	bool operator>(real32_T a) const;
};

void bar() {
	real32_T d;


	
	if ((d == static_cast<real32_T>(0.0F))
	|| (static_cast<real32_T>(0.0F) > d)) {//Noncompliant
		/**/
	}
}



void foo(int i, int j){
	if(i==0 && ++j==i){ //Noncompliant
		--i;
	}
}

В функциональном foo, правильный операнд && оператор содержит инкрементную операцию, которая имеет побочный эффект. Polyspace отмечает оператор. В функциональном bar, правильный операнд || оператор содержит функцию преобразования, которая реализована в классе. Polyspace полагает, что у такого конструктора есть побочные эффекты. Поскольку правильный оператор имеет побочные эффекты, оператор отмечается.

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

Группа: Выражения
Категория: необходимый
Введенный в R2013b