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

Средство проверки правила не отмечает аргументы Array C-стиля в объявлениях функции, потому что нарушение правила все еще существует, если вы фиксируете объявление функции а не определение. Функциональная сила быть объявленным в вашем коде и заданным в библиотеке, к которой вы не можете получить доступ. Средство проверки отмечает аргументы Array 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 даже когда нет никакого явного определения C-стиля массивов для аргумента. Например, объявление 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 вспомогательных библиотек языка
Категория: необходимый, автоматизированный
Введенный в R2019b