MISRA C++:2008 Rule 5-0-19

Объявление объектов должно содержать не больше, чем два уровня косвенности указателя

Описание

Управляйте определением

Объявление объектов должно содержать не больше, чем два уровня косвенности указателя.

Объяснение

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

Реализация Polyspace

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

}

Поиск и устранение проблем

Если вы ожидаете нарушение правила, но не видите его, обратитесь к Кодированию Стандартных Нарушений, Не Отображенных.

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

Группа: Выражения
Категория: необходимый
Введенный в R2013b