exponenta event banner

Правило AUTOSAR C++ 14 A18-1-1

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

Описание

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

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

Объяснение

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

Стандарт AUTOSAR допускает объявление static constexpr элементы данных типа массива C-style. Например, это объявление соответствует требованиям.

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

Внедрение Polyspace

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