Number of goto statements exceeds threshold

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

Описание

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

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

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

Риск

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

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

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

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

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

Чтобы исправить эту проверку, измените порог проверки или измените код. Можно заменить большинство применений goto оператор более простыми структурами управления. В образцах, когда a 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;
}

В этом примере a 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