実行時検査によって報告されるエラーは一般に、アクセスエラーとリークという 2 つのカテゴリに分類されます。
アクセス検査が有効になっている場合、実行時検査では、このセクションで説明されている種類のエラーを検出して報告します。
意味: 割り当てられたことのないメモリーを解放しようとした。
考えられる原因: ヒープデータ以外のポインタを free() または realloc() に渡しています。
例:
char a[4]; char *b = &a[0]; free(b); /* Bad free (baf) */
意味: すでに解放されているヒープブロックを解放しようとした。
考えられる原因: 同じポインタを使用して free() を 2 回以上呼び出した。C++ では、同じポインタに対して "delete" 演算子を 2 回以上使用した。
例:
char *a = (char *)malloc(1); free(a); free(a); /* Duplicate free (duf) */
意味: 境界合わせされていないヒープブロックを解放しようとした。
考えられる原因: 正しく境界合わせされていないポインタを free() または realloc() に渡しています。malloc によって返されたポインタを変更しています。
例:
char *ptr = (char *)malloc(4); ptr++; free(ptr); /* Misaligned free */
意味: 適切に境界合わせされていないアドレスからデータを読み取ろうとした。
考えられる原因: ハーフワード、ワード、ダブルワードの境界に合わせられていないアドレスから、それぞれ 2 バイト、4 バイト、8 バイトを読み取った。
例:
char *s = “hello world”; int *i = (int *)&s[1]; int j; j = *i; /* Misaligned read (mar) */
意味: 適切に境界合わせされていないアドレスにデータを書き込もうとした。
考えられる原因: ハーフワード、ワード、ダブルワードの境界に合わせられていないアドレスに、それぞれ 2 バイト、4 バイト、8 バイトを書き込んだ。
例:
char *s = “hello world”; int *i = (int *)&s[1]; *i = 0; /* Misaligned write (maw) */
意味: 利用可能な物理メモリーより多くのメモリーを割り当てようとした。
考えられる原因: プログラムがこれ以上システムからメモリーを入手できない。oom エラーは、malloc() からの戻り値が NULL かどうか検査していない (プログラミングでよく起きる誤り) ために発生する問題の追跡に役立ちます。
例:
char *ptr = (char *)malloc(0x7fffffff); /* Out of Memory (oom), ptr == NULL */
意味: 配列範囲外のメモリーからデータを読み取ろうとした。
考えられる原因: 浮遊ポインタ、ヒープブロックの境界を越えています。
例:
char *cp = malloc (10); char ch = cp[10];
意味: 存在しないメモリー、割り当てられていないメモリー、マップされていないメモリーからデータを読み取ろうとした。
考えられる原因: ストレイポインタ (不正な値を持つポインタ)、ヒープブロック境界のオーバーフロー、すでに解放されたヒープブロックへのアクセス。
例:
char *cp = malloc (10); free (cp); cp[0] = 0;
意味: 初期化されていないメモリーからデータを読み取ろうとした。
考えられる原因: 初期化されていない局所データまたはヒープデータの読み取り。
例:
foo() { int i, j; j = i; /* Read from uninitialized memory (rui) */ }
意味: 配列範囲外のメモリーにデータを書き込もうとした。
考えられる原因: 浮遊ポインタ、またはヒープブロックの境界を越えています。
例:
char *cp = malloc (10); cp[10] = 'a';
意味: 読み取り専用メモリーにデータを書き込もうとした。
考えられる原因: テキストアドレスへの書き込み、読み取り専用データセクション (.rodata) への書き込み、読み取り専用として mmap されているページへの書き込み。
例:
foo() { int *foop = (int *) foo; *foop = 0; /* Write to read-only memory (wro) */ }
意味: 存在しないメモリー、割り当てられていないメモリー、マップされていないメモリーにデータを書き込もうとした。
考えられる原因: ストレイポインタ (不正な値を持つポインタ)、ヒープブロック境界のオーバーフロー、すでに解放されたヒープブロックへのアクセス。
例:
char *cp = malloc (10); free (cp); cp[0] = 0;
リーク検査が有効になっている場合、実行時検査では、次の種類のエラーを報告します。
意味: メモリーリークの可能性がある。割り当てたブロックの先頭に対する参照はないが、そのブロック内のアドレスに対する参照が少なくとも 1 つある。
考えられる原因: そのブロックの先頭を示す唯一のポインタが増分された。
例:
char *ptr; main() { ptr = (char *)malloc(4); ptr++; /* Address in Block */ }
意味: メモリーリークの可能性がある。割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラムメモリー内のどこにも存在しませんが、レジスタ内には参照が存在します。
考えられる原因: この状況は、コンパイラがプログラム変数をメモリー内には保持せず、レジスタ内にのみ保持している場合に正常な状態として発生することがあります。コンパイラは多くの場合、最適化が有効になっているときに、局所変数や関数パラメータに対してこの動作を実行します。最適化が有効になっていないときにこのエラーが発生した場合は、実際のメモリーリークである可能性があります。この状況は、割り当てられたブロックへの唯一のポインタが、そのブロックが解放される前にスコープから外れた場合に発生することがあります。
例:
if (i == 0) { char *ptr = (char *)malloc(4); /* ptr is going out of scope */ } /* Memory Leak or Address in Register */
意味: 割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラム内のどこにも存在しません。
考えられる原因: プログラムが使用されなくなったブロックを解放しなかった。
例:
char *ptr;
ptr = (char *)malloc(1); ptr = 0; /* Memory leak (mel) */