exponenta event banner

Правило AUTOSAR C++ 14 A5-0-3

Объявление объектов должно содержать не более двух уровней косвенности указателя

Описание

Определение правила

Объявление объектов должно содержать не более двух уровней косвенности указателя.

Объяснение

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

Внедрение 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

}

Поиск неисправностей

Если вы ожидаете нарушения правила, но не видите его, обратитесь к разделу Нарушения стандартов кодирования не отображаются.

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

Группа: Выражения
Категория: Обязательно, Автоматизировано
Представлен в R2019a