-secure_malloc 【Professional 版のみ】 【V2.05.00以降】
|
<ライブラリジェネレータ・オプション / ライブラリオプション>
[指定形式]
[詳細説明]
記憶域に対する不正な操作を検出するためのセキュリティ機能を追加した calloc、free、malloc、realloc関数を生成します。
次の操作を行なった場合に__heap_chk_fail関数を呼び出します。
- | calloc、malloc、reallocで確保した領域以外のポインタをfree、reallocに渡す。 |
- | freeで開放した後のポインタを再度free、reallocに渡す。 |
- | calloc、malloc、reallocで確保した領域の外側(前後それぞれ4バイトまで)に値を書き込んだ後free、reallocに渡す。 |
C++プログラムのnew、delete 演算子にも同じ機能が追加されます。
__heap_chk_fail関数はユーザが定義する必要があり、動的メモリ管理の異常時に実行する処理を記述します。
__heap_chk_fail関数を定義する際には、次の項目に注意してください。
- | 返却値の型はvoid型のみであり、仮引数を持たない関数です。 |
- | C++プログラム内で__heap_chk_fail関数を定義する場合は「extern "C"」を付加してください。 |
- | __heap_chk_fail 関数内で再帰的に記憶域の破壊を検出しないように注意してください。 |
- | __heap_chk_fail関数を定義する場合は、staticを指定しないでください。 |
[記述例]
#include <stdlib.h>
void sub(int *ip) {
...
free(ip);
}
int func(void) {
int *ip;
if ((ip = malloc(40 * sizeof(int))) == NULL)
if ((ip = malloc(10 * sizeof(int))) == NULL) return(1);
else sub(ip); /* 1回目のfree */
else
...
free(ip); /* 2回目のfree */
return(0);
}
#ifdef __cplusplus
extern "C" {
#endif
void __heap_chk_fail(void) {
/* ヒープ領域破壊を検出したときの処理 */
}
#ifdef __cplusplus
}
#endif
|
[備考]
セキュリティ機能を追加したcalloc、 malloc およびreallocは、領域外への書き込みを検出するために前後4バイト余分に領域を確保します。このため通常より多くヒープ領域を消費します。これはC++プログラムのnew演算子も同じです。