メインコンテンツ

sizeof のオペランドに含まれる式が冗長です

sizeof オペランドに評価されない式が含まれている

説明

この欠陥は、sizeof オペランドに、評価が sizeof 結果に影響しない式が含まれている場合に発生します。sizeof オペランド内の現在の式の代わりに、データ型、変数、またはより単純な式を使用することもできます。これによって、機能性が失われることはありません。

リスク

この欠陥によってフラグが設定された場合は、sizeof オペランド内の式が必要以上に複雑になって、コードの可読性が低下し、保守性コストが増加します。式が、sizeof オペランドの結果に関する誤った印象を与える可能性もあります。

たとえば、次の式を考えてみましょう。

sizeof(void (*[n])(int arr[U+V]))
sizeof のオペランドは、それぞれの型が void () (int*)n 関数ポインターの配列です。評価されない追加の U+V は、式全体を必要以上に複雑にします。また、式が、サイズ U+V の配列である関数ポインター引数が sizeof の結果にとって重要であるという誤った印象を与えることにもなります。

修正方法

欠陥トレースバック内の最初のイベントは、sizeof オペランドの冗長な部分式が始まることを示しています。

冗長な式を単純化するか、完全に削除します。可能な場合は、データ型を sizeof オペランドとして使用します。たとえば、前述の例では、より単純で等価の sizeof 演算が次のようになります。

sizeof(void (*[n])(int*))

式を評価するには、別のステートメントで評価を実行します。

すべて展開する

void func() {
    int size1, size2, size3;
    char x = 0;
    short y = 0;
    int z = 0, w = 0;
    
    size1 = sizeof(x + y);
    size2 = sizeof(x + z);
    size3 = sizeof(z + w);
}

この例では、欠陥チェッカーが 2 つ目と 3 つ目の sizeof 演算にフラグを設定します。これは、sizeof オペランド内の式を sizeof の結果を変更せずに単純化できるためです。

チェッカーは、1 つ目の演算にはフラグを設定しません。これは、sizeof オペランド内の式を sizeof の結果に影響を与えずにこれ以上単純化することができないためです。

修正 – sizeof オペランド内の式を単純化する

sizeof オペランド内の式を単純化します。以下の修正では、sizeof の結果が前述の式を使用した場合と同じになります。

void func() {
    int size1, size2, size3;
    char x = 0;
    short y = 0;
    int z = 0, w = 0;
    
    size1 = sizeof(x + y);
    size2 = sizeof(z);
    size3 = sizeof(z);
}

結果情報

グループ: 適切な手法
言語: C | C++
既定値: オフ
コマンド ライン構文: SIZEOF_USELESS_OP
影響度: Low

バージョン履歴

R2020a で導入