|
意味 : メモリーリークの可能性がある。割り当てブロックの先頭への参照はないが、そのブロック内のアドレスへの参照が少なくとも 1 つ存在する。 |
|
考えられる原因 : そのブロックの先頭を指す唯一のポインタが増分された。 |
char *ptr;
main()
{
ptr = (char *)malloc(4);
ptr++; /* ブロック中のアドレス (aib) */
}
|
意味 : メモリーリークの可能性がある。割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラム内のどこにも存在しない。 |
|
考えられる原因 : 割り当てられているブロックへの唯一の参照は、レジスタ内に含まれています。このようなことは、コンパイラがプログラム変数をメモリー内ではなくレジスタ内だけに保持している場合に発生し、その動作は正しいこともあります。最適化がオンになっている場合、コンパイラは局所変数や関数パラメータに対してこのような操作をよく行います。最適化がオンになっていないときにこのエラーが発生した場合は、実際のメモリーリークが考えられます。たとえば、割り当てられているブロックへの唯一のポインタが、そのブロックの解放前にスコープ外に出た場合にこのエラーが発生します。 |
if (i == 0) {
char *ptr = (char *)malloc(4);
/* ポインタがスコープ外に出た */
}
/* メモリーリークまたはレジスタ中のアドレス (air) */
|
意味 : 割り当てられたことのないメモリーを解放しようとした。 |
|
考えられる原因 : 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) */
|
意味 : 割り当てられたブロックが解放されておらず、そのブロックへの参照がプログラム内のどこにも存在しない。 |
|
考えられる原因 : プログラムが使用されなくなったブロックを解放しなかった。 |
char *ptr; ptr = (char *)malloc(1); ptr = 0; /* メモリーリーク (mel) */
|
意味 : 利用可能な物理メモリーより多くのメモリーを割り当てようとした。 |
|
考えられる原因 : プログラムがこれ以上システムからメモリーを入手できない。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) */