EN JP CN

UNREACH.SIZEOF

UNREACH.SIZEOF

'sizeof' に対する条件が原因の到達不能コード

UNREACH.SIZEOF チェッカーは、コードのコンパイル時に対象のアーキテクチャで常に false になるデータ型 (‘sizeof’ キーワードによって計算される) のサイズに対する条件によって保護されるため、決して実行されないコードを探します。UNREACH.SIZEOF の一般的な使用法は、アーキテクチャ依存の ‘sizeof’ に対する条件が原因の到達不能なコードを他のタイプの到達不能コードから切り離すことです。使用されるデータ型のサイズに依存する到達不能コードになると予想される場合でも、一般に到達不能コードをさらに UNREACH.GEN でチェックするときは、UNREACH.SIZEOF チェッカーを無効にできると便利です。

脆弱性とリスク

‘sizeof’ に対する条件が原因の到達不能コードは、コードのメンテナンスやレビュー時に混乱を招く可能性があります。

脆弱コード例

1 int get_ptr_size(void* ptr)
2 {
3   int x = 0;
4   switch (sizeof(ptr)) {
5   case 4:
6     x = 4;
7     break;
8   case 8:
9     x = 8;
10    break;
11  default:
12    x = 16;
13    break;
14  }
15  return x;
16 }

Klocwork は一部のケースでは決して到達しない場合もあることを示す到達不能コードのレポートを生成します。このレポートで報告されるケースは、対象のアーキテクチャによって異なります。たとえば、対象のアーキテクチャのポインターサイズが 32 ビット (4 バイト) である場合、case 4 のみが到達可能なケースとなります。この場合、case 8 (9 行目) の欠陥が報告されます。このシナリオでは明らかに、動作は良性であるため、レビュー担当者はこのチェッカーを無効にするのが一般的です (特に、異なるアーキテクチャにコンパイルされることを意図したコードの場合)。

関連チェッカー

拡張機能

このチェッカーは機能を拡張できません。