exponenta event banner

Количество goto операторы превышают пороговое значение

Количество goto операторы в функции превышают заданное пороговое значение

Описание

Этот дефект возникает в функции, когда количество goto операторы в функции больше заданного порога. Дополнительные сведения о том, как Polyspace вычисляет количество goto операторы, см. Number of Goto Statements

В Polyspace ® используется нулевой порог по умолчанию, если не указано пороговое значение. Чтобы указать файл выбора, в котором можно задать пороговое значение, используйтеSet checkers by file (-checkers-selection-file). См. также раздел Снижение сложности программного обеспечения с помощью средств проверки полиспейса.

При импорте комментариев из предыдущих анализов с помощью polyspace-comments-import, Polyspace копирует любую информацию о проверке в метрике кода Number of Goto Statements в предыдущем результате для этой проверки в текущем результате. Если текущий результат содержит ту же метрику кода, информация проверки также копируется в метрику кода.

Риск

Нарушение этой проверки может указывать на то, что:

  • Модуль имеет чрезмерно сложный поток выполнения.

  • Модуль может содержать непредвиденную или незапланированную разработку.

С несколькими goto операторы, трудно определить точный порядок выполнения кода, который может привести к ошибке или правильному результату. Эти факторы затрудняют обслуживание и отладку модуля.

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

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

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

Примеры

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

#include<stdbool.h>
bool* getCondition();
void foo(){//Noncompliant
	bool* cond;
	cond = getCondition();
	while(*(cond+0)){
		//...
		while(*(cond+1)){
			//...
			while(*(cond+2)){
				//...
				if(*(cond+3)){
				goto HARDBREAK;
				}
			}
		}
	}
HARDBREAK:
		;
		//....
		return;
}

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

Коррекция - рефакторирование кода или изменение порога

Одной из возможных корректировок является рефакторирование кода, чтобы не было goto операторов в коде. Например, вы можете использовать return оператор, чтобы выйти из глубоко вложенной структуры.

#include<stdbool.h>
bool* getCondition();
void foo(){//Compliant
	bool* cond;
	cond = getCondition();
	while(*(cond+0)){
		//...
		while(*(cond+1)){
			//...
			while(*(cond+2)){
				//...
				if(*(cond+3)){
				return;
				}
			}
		}
	}

}

Кроме того, можно рассмотреть этот экземпляр goto как приемлемый. В этом случае измените порог, изменив XML-файл выбора шашек для разрешения проверки.

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

Группа: Сложность программного обеспечения
Язык: C | C++
Акроним: SC13
Порог по умолчанию: 0
Представлен в R2021a