EN JP CN

LOCRET.RET

LOCRET.RET

関数によって戻り値のローカル変数のアドレスが返されました

LOCRET.RET チェッカーは、関数が return ステートメント内の式を介してローカル変数のアドレスを返すインスタンスを検出します。

脆弱性とリスク

ローカル変数はスタックに割り当てられるため、関数がポインターを変数に返すとき、スタックアドレスが返されています。このアドレスは関数から戻った後は無効になります。このため、このアドレスにアクセスすると、アプリケーションが予期しない動作 (通常、プログラムクラッシュ) をする可能性があります。

脆弱コード例

1  #include <stdlib.h>
2  
3  int *func_RET(unsigned n)
4  {
5      int aux;
6      int *p;
7      if (n == 1) {
8          p = &aux;
9      } else {
10         p = (int *)malloc(n * sizeof(int));
11     }
12     return p;
13 }

Klocwork 関数 func_RET が return ステートメントを介してローカル変数のアドレスを返していることを示す 12 行目にフラグを立てます。ローカル変数 aux のアドレスは変数 p に割り当てることができ、変数 p が返されます。

関連チェッカー