アクセス検査がオンのとき、RTC による検出と報告の対象になるのは次のタイプのエラーです。
意味: 割り当てられたことのないメモリーを解放しようとした。
考えられる原因: free() または realloc() にヒープデータ以外のポインタを渡した。
例:
char a[4]; char *b = &a[0]; free(b); /* 不正開放 (baf) */
意味: すでに解放されているヒープブロックを解放しようとした。
考えられる原因: 同じポインタを使用して free() を 2 回以上呼び出した。C++ では、同じポインタに対して "delete" 演算子を 2 回以上使用した。
例:
char *a = (char *)malloc(1); free(a); free(a); /* 重複開放 (duf) */
意味: 境界合わせされていないヒープブロックを解放しようとした。
考えられる原因: free() または realloc() に正しく境界合わせされていないポインタを渡した。 malloc によって返されたポインタを変更した。
例:
char *ptr = (char *)malloc(4); ptr++; free(ptr); /* 境界整列を誤った開放 (maf) */
意味: 適切に境界合わせされていないアドレスからデータを読み取ろうとした。
考えられる原因: ハーフワード、ワード、ダブルワードの境界に合わせられていないアドレスから、それぞれ 2 バイト、4 バイト、8 バイトを読み取った。
例:
char *s = "hello world"; int *i = (int *)&s[1]; int j; j = *i; /* 境界整列を誤った読み取り (mar) */
意味: 適切に境界合わせされていないアドレスにデータを書き込もうとした。
考えられる原因: ハーフワード、ワード、ダブルワードの境界に合わせられていないアドレスに、それぞれ 2 バイト、4 バイト、8 バイトを書き込んだ。
例:
char *s = "hello world"; int *i = (int *)&s[1]; *i = 0; /* 境界整列を誤った書き込み (maw) */
意味: 利用可能な物理メモリーより多くのメモリーを割り当てようとした。
考えられる原因: プログラムがこれ以上システムからメモリーを入手できない。oom エラーは、malloc() からの戻り値が NULL かどうか検査していない (プログラミングでよく起きる誤り) ために発生する問題の追跡に役立ちます。
例:
char *ptr = (char *)malloc(0x7fffffff); /* メモリー不足 (oom), ptr == NULL */
意味: 存在しないメモリー、割り当てられていないメモリー、マップされていないメモリーからデータを読み取ろうとした。
考えられる原因: ストレイポインタ (不正な値を持つポインタ)、ヒープブロック境界のオーバーフロー、すでに解放されたヒープブロックへのアクセス。
例:
char c, *a = (char *)malloc(1); c = a[1]; /* 非割り当てメモリーからの読み取り (rua) */
意味: 初期化されていないメモリーからデータを読み取ろうとした。
考えられる原因: 初期化されていない局所データまたはヒープデータの読み取り。
例:
foo() { int i, j; j = i; /* 非初期化メモリーからの読み取り (rui) */ }
意味: 読み取り専用メモリーにデータを書き込もうとした。
考えられる原因: テキストアドレスへの書き込み、読み取り専用データセクション (.rodata) への書き込み、読み取り専用として mmap されているページへの書き込み。
例:
foo() { int *foop = (int *) foo; *foop = 0; /* 読み取り専用メモリーへの書き込み (wro) */ }
意味: 存在しないメモリー、割り当てられていないメモリー、マップされていないメモリーにデータを書き込もうとした。
考えられる原因: ストレイポインタ (不正な値を持つポインタ)、ヒープブロック境界のオーバーフロー、すでに解放されたヒープブロックへのアクセス。
例:
char *a = (char *)malloc(1); a[1] = '\0'; /* 非割り当てメモリーへの書き込み (wua) */