exponenta event banner

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

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

Описание

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

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

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

Риск

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

  • Функция слишком длинна.

  • Функция выполняет множество задач, а не одну конкретную задачу.

Эти факторы затрудняют обслуживание и отладку модуля.

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

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

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

  • Рассмотрите возможность объединения переменных, имеющих сходную роль, в такие контейнеры, как классы, структуры, векторы или карты.

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

Примеры

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

#include <string>
void foo(void){//Noncompliant
	
	int Value1,Value2,Value3,Value4,Value5,Value6,Value7,Value8,Value9,Value10,Value11;
	std::string Name1,Name2,Name3,Name4,Name5,Name6,Name7,Name8,Name9,Name10,Name11;
	//....
	
}

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

Исправление - Объединение связанных данных в контейнеры

Одной из возможных корректировок является объединение связанных данных в контейнеры. Например, в этом коде данные объединяются в std::map контейнер, который затем переносится в класс. Затем в коде необходимо объявить только одну локальную переменную и использовать ее для хранения данных, управления ими и доступа к ним. Этот код проще поддерживать, тестировать и отлаживать.

#include <string>
#include <map>
class Instance{
	public:
	Instance();
	Instance(int, std::string);
	protected:
	addData(int,std::string);
	getValue(std::string);
	//...
	private:
	std::map<std::string, int> DataMap;
	
};
void foo(void){//Compliant
	
	Instance A;
	//....
	A.addData(5,"Name");
	
}

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

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