Number of goto statements exceeds threshold

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

Описание

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

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

Когда вы импортируете комментарии из предыдущих исследований при помощи 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