Number of local nonstatic variables exceeds threshold

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

Описание

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

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

Когда вы импортируете комментарии из предыдущих анализов при помощи polyspace-comments-importPolyspace копирует любую рецензирующую информацию о метрике кода 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