メインコンテンツ

AUTOSAR C++14 Rule A18-1-1

C スタイル配列を使用してはなりません。

説明

ルール定義

C スタイル配列を使用してはなりません。

根拠

C スタイル配列は、配列の宣言時に std::array のようにクラスでラップされない配列です。C スタイル配列のサイズ情報が失われる可能性があります。たとえば、関数に渡す配列が、その配列の最初の要素を指すポインターに変化します。これにより、コードの保守が困難になったり、保守する際の安全性が損なわれたりする可能性があります。

AUTOSAR 規格では、C スタイル配列型の static constexpr データ メンバーを宣言することが許可されています。たとえば、次の宣言は準拠しています。

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));
}
引数について明示的な C スタイル配列定義が存在しない場合であっても、チェッカーは foo の定義内の arg にフラグを立てます。たとえば、baz() 内の char value[10]; の代わりに char* value; を宣言すると、依然として foo の引数に対するルール違反となる可能性があります。

トラブルシューティング

ルール違反が想定されるものの、Polyspace® から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。

すべて展開する

#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 言語サポート ライブラリ
カテゴリ: Required、Automated

バージョン履歴

R2019b で導入