Объявление объектов должно содержать не больше, чем два уровня косвенности указателя
Объявление объектов должно содержать не больше, чем два уровня косвенности указателя.
Если вы используете указатели больше чем с двумя уровнями абстракции, разработчик, читающий код, может найти трудным изучить поведение кода.
Polyspace® отмечает все объявления объектов, которые содержат больше чем два уровня косвенности указателя.
Если вы используете псевдонимы типа, средство проверки включает косвенность указателя от псевдонима в оценке уровня абстракции. Например, в этом фрагменте кода, объявлении var
несовместимо. Тип var
const
указатель на const
указатель на указатель на char
, который является тремя уровнями косвенности указателя. Объявление var2
имеет два уровня косвенности указателя и совместим.
using ptrToChar = char*; void func() { ptrToChar* const* const var = nullptr; //Non-compliant, 3 levels of indirection char* const* const var2 = nullptr; //Compliant, 2 levels of indirection //... }
Если вы передаете массив функции, преобразование массива к указателю на первый элемент массива включено в оценку уровня абстракции. Например, в этом фрагменте кода, параметр arrParam
несовместимо. Тип arrParam
указатель на указатель на указатель на char
(три уровня косвенности указателя). Объявление arrVar
совместимо потому что arrVar
имеет массив типа указателя на указатель, чтобы обуглиться (два уровня косвенности указателя).
void func(char** arrParam[]) //Non-compliant { //... char** arrVar[5]; //Compliant }
Это средство проверки не отмечает использование объектов больше чем с двумя уровнями абстракции. Например, в этом фрагменте кода, объявлении var
несовместимо, но оценка размера var
совместимо.
#include<iostream> using charToPtr = char*; void func() { charToPtr* const* const var = nullptr; //Non-compliant std::cout << sizeof(var) << std::endl; //Compliant }
Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.
Группа: Выражения |
Категория: необходимый |