exponenta event banner

AUTOSAR C++ 14 Rule A18-1-1

Массивы в стиле C не должны использоваться

Описание

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

Массивы в стиле C не должны использоваться.

Объяснение

Массив C-стиля является массивом, который не упакован в класс, такой как std::array когда массив объявлен. Можно потерять информацию о размере массива C-стиля. Например, массив, который вы передаете в функцию, распадается в указатель на первый элемент массива. Это может привести к небезопасности и трудностям в обслуживании кода.

Стандарт AUTOSAR позволяет объявлять static constexpr представители данных типа массива C-стиля. Для примера это объявление соответствует.

class A
{
  public:
    static constexpr std::uint8_t array[] {0, 1, 2}; // Compliant by exception
};

Реализация Polyspace

Проверка правил не помечает аргументы массива C-стиля в объявлениях функций, потому что нарушение правил все еще существует, если вы исправляете объявление функции, а не определение. Функция может быть объявлена в коде и определена в библиотеке, к которой вы не можете получить доступ. Блок проверки помечает аргументы массива в стиле С в определениях функций. Например, в этом фрагменте кода шашка помечает аргумент foo но не аргумент bar.

extern void bar(char arg[]); //Declaration, checker raises no rule violation
int foo(char arg[]) // Definition, checker raises a rule violation
{
    return sizeof(arg); //Returns size of pointer, not size of array
}
void baz()
{
    char value[10]; //C-style array, checker raises a rule violation
    assert(sizeof(value) == foo(value));
}

Шашка поднимает флаг на arg в определении foo даже если для аргумента нет явного определения массива в стиле С. Для примера объявления char* value; вместо char value[10]; в baz() все еще привести к нарушению правил в отношении аргумента foo.

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

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

Примеры

расширить все

#include <array>

void func()
{

    const std::uint8_t size = 10;
    std::int32_t a1[size]; //non-compliant
    std::array<std::int32_t, size> a2; //compliant

}

В этом примере правило нарушается при объявлении массива в стиле C a1. Чтобы объявить массивы, выделенные из стека фиксированного размера, используйте std:array вместо этого.

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

Группа: 18 Language Support Library
Категория: Необходимый, Автоматизированный
Введенный в R2019b