メインコンテンツ

AUTOSAR C++14 Rule A2-13-4

文字列リテラルは非定数ポインターに割り当てないものとします。

説明

ルール定義

文字列リテラルは非定数ポインターに割り当てないものとします。

根拠

このルールは、非 const オブジェクトを指しているポインターへの文字列リテラルの代入を防止します。このような代入では、その後の文字列リテラルの変更が許可されます。

文字列リテラルを変更しようとすると未定義の動作が発生する可能性があります。たとえば、実装の一部で文字列リテラルを読み取り専用メモリに保存できるとします。文字列リテラルを変更しようとすると、例外やクラッシュが発生する可能性があります。

最近の C++ 標準では、このような変更に対してコンパイラ警告が要求されます。コンパイラ警告が抑制されている (かつ、AUTOSAR C++14 ルールがこれらの警告に関連付けられている) 状況ではこのルールが適用されます。

Polyspace 実装

ルール チェッカーは、const オブジェクトへのポインター以外のポインターへの文字列リテラルの代入にフラグを設定します。

チェッカーは、非 const 配列への文字列リテラルの代入にはフラグを設定しません。AUTOSAR C++ 14 ルール A18-1-1 のチェッカーは、C スタイル配列の直接使用を禁止し、これらの代入を防止します。

トラブルシューティング

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

すべて展開する

char *str1 = "xxxxxx";            // Non-Compliant 
const char *str2 = "xxxxxx";      // Compliant 

void checkSystem1(char*);
void checkSystem2(const char*);

void main() {
 checkSystem1("xxxxxx");    // Non-Compliant 
 checkSystem2("xxxxxx");    // Compliant 
}

この例では、文字列リテラルが const char* ポインターに直接または関数の引数のコピーを介して代入される場合、ルールに違反しません。const 修飾子を使用しない場合のみルールに違反します。

チェック情報

グループ: 構文規則
カテゴリ: Required、Automated

バージョン履歴

R2019a で導入