AUTOSAR C++14 Rule A27-0-4
説明
ルール定義
C-style strings shall not be used.
根拠
C スタイルの文字列を保存する基となる文字配列には、次のようなさまざまな欠点があります。
非トリビアルなメモリ操作が必要な文字列に対する操作を実行する場合は、メモリの割り当てと割り当て解除を明示的に処理する必要があります。
char*が単一の文字を指しているのか、C スタイルの文字列を指しているのかは必ずしも明確ではありません。配列を値またはポインターとして関数に渡すときに、誤って生のポインターに変換してしまった場合は、配列サイズに関する情報が消失します (配列減衰)。たとえば、次のコード スニペットでは、
funcがcStringの最初の文字へのポインターのサイズ (8) を出力しますが、cStringの実際のサイズは 6 です。void func(char *c){ //function takes array by value cout << sizeof(c); } void main(){ char cString[]{ "pizza" }; //Size is 6 (5 characters + null terminator) func(cString); // Size is 8 (size of char*) }
代わりに、std::string クラスを使用して文字のシーケンスを保存します。このクラスは、割り当てと割り当て解除を処理し、安全に関数に渡すことが可能なオブジェクトをインスタンス化します。また、このクラスには、反復子などの文字列を操作するための機能が組み込まれています。
Polyspace 実装
Polyspace® は以下の使用にフラグを設定します。
文字へのポインター (
char*) と文字の配列 (char someArray[])。volatileやconstなどの型修飾子を使用した文字へのポインターと文字の配列。たとえば、char const*です。wchar_t型、char16_t型、およびchar32_t型へのポインターと配列。
ソース コード内に関数宣言と関数定義が含まれている場合は、Polyspace がその関数定義を違反とします。以下に例を示します。
const char* greeter(void);
//....
const char* greeter(void){ //Non-compliant
return "Hello";
}Polyspace は、次の使用にフラグを設定しません。
signed文字またはunsigned文字へのポインターまたは配列。たとえば、次のコード スニペット内のsigned_cとunsigned_arrにはフラグが設定されません。signed char* signed_c; unsigned char unsigned_arr[2048];
リテラル文字列。たとえば、次のコード スニペット内の
greeter()の戻り値にはフラグが設定されませんが、最初の行内のconst char*の使用にはフラグが設定されます。const char* greeter(void){ //Non-compliant return "Hello"; // Compliant }main()のパラメーター。
トラブルシューティング
ルール違反が想定されるものの、Polyspace から報告されない場合は、コーディング規約違反が想定どおりに表示されない理由の診断を参照してください。
例
チェック情報
| グループ: Input/output library |
| カテゴリ: Required、Automated |
バージョン履歴
R2021a で導入