EN JP CN

LOCRET.ARG

LOCRET.ARG

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

LOCRET.ARG チェッカーは、関数が、引数によって参照されたメモリにアドレスを書き込むことにより、ローカル変数のアドレスを返すインスタンスを検出します。

脆弱性とリスク

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

脆弱コード例

1  #include <stdlib.h>
2  
3  void func_ARG(int **pp, unsigned n)
4  {
5      int aux;
6      if (n == 1) {
7          *pp = &aux;
8      } else {
9          *pp = (int *)malloc(n * sizeof(int));
10     }
11 }

Klocwork 関数 func_ARG が引数を介してローカル変数のアドレスを返していることを示す 9 行目にフラグを立てます。ローカル変数 aux のアドレスは *pp に割り当てることができます。これは関数が戻るときに使用できます。

関連チェッカー