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 имеет массив типов указателя на указатель на char (два уровня опосредования указателя).

    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