動的メモリーアクセス検査では、次の種類の警告が検出されます。
AZS: 0 サイズの割り当て (allocating zero size)
メモリーリーク
SMR: 投機的な非初期化メモリーからの読み取り (speculative uninitialized memory read)
このセクションでは、警告の考えられる原因と、警告が発生する可能性があるコードの例を説明します。
例:
#include <stdlib> int main() { int *p = malloc(); // Allocating zero size memory block }
考えられる原因: メモリーが割り当てられるが、関数の終了またはエスケープの前に解放されていません。
例:
int foo() { int *p = (int*) malloc(sizeof(int)); if (x) { p = (int *) malloc(5*sizeof(int)); // will cause a leak of the 1st malloc } } // The 2nd malloc leaked here
例:
int i; if (foo(&i) != 0) /* foo returns nonzero if it has initialized i */ printf("5d\n", i);
コンパイラは、前述のソースに対して次の同等のコードを生成する可能性があります。
int i; int t1, t2' t1 = foo(&i); t2 = i; /* value in i is loaded. So even if t1 is 0, we have uninitialized read due to speculative load */ if (t1 != 0) printf("%d\n", t2);