exponenta event banner

Число локальных статических переменных превышает пороговое значение

Число локальных статических переменных в функции превышает заданное пороговое значение

Описание

Этот дефект возникает в функции, когда число локальных статических переменных в функции превышает заданное пороговое значение средства проверки. Дополнительные сведения о том, как Polyspace вычисляет количество локальных статических переменных в функции, см. в разделе Number of Local Static Variables.

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

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

Риск

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

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

Чтобы исправить эту проверку, выполните рефакторинг кода или измените порог проверки. При рефакторинге кода:

  • Инкапсулируйте и модулируйте независимые данные или код.

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

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

Примеры

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

void foo(void){//Noncompliant
	
	static int a;
	static int b;
	static int c;
	static int d;
	static int e;
	static int f;
	static int g;
	//...
}

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

Исправление - инкапсуляция связанных данных

Одной из возможных корректировок является инкапсуляция связанных данных в структуры или классы. В этом коде связанные целочисленные переменные инкапсулируются в структуру. Функция foo теперь содержит только одну статическую копию структуры..

typedef struct {
	int a;
	int b;
	int c;
	int d;
	int e;
	int f;
	int g;
} data_vars;
void foo(void){//Compliant
	
	static data_vars A;
	//...
}

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

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