アドレスサニタイザ
アドレスサニタイザのAPIを使用するには、solid_asan.h をインクルードしてください。
#include "solid_asan.h"
ASAN_ERROR_TYPE
-
enum
ASAN_ERROR_TYPE
アドレスサニタイザのエラータイプ
定数
名前
説明
ASAN_NOERROR
エラー非検出
ASAN_ERROR_GLOBAL_OOB
グローバル変数領域に対しての範囲外アクセス
ASAN_ERROR_HEAP_OOB
ヒープ領域に対しての範囲外アクセス
ASAN_ERROR_STACK_OOB
スタック領域に対しての範囲外アクセス
ASAN_ERROR_USE_AFTER_FREE
freeした領域に対してのアクセス
ASAN_ERROR_DOUBLE_FREE
二重free
ASAN_ERROR_INFO
-
typedef struct _ASAN_ERROR_INFO
ASAN_ERROR_INFO
説明
アドレスサニタイザのレポート関数のパラメータとして渡されるエラー情報構造体
定義
typedef struct _ASAN_ERROR_INFO { const void *access_addr; size_t access_size; uintptr_t ip; int is_write; int task_id; enum ASAN_ERROR_TYPE error_type; } ASAN_ERROR_INFO;
メンバー
- access_addr
アクセスされたアドレス
- access_size
アクセスサイズ
- ip
エラー検出時に実行していた実行アドレス(PCの値)
- is_write
リードアクセスの場合は1, ライトアクセスの場合は0
- task_id
エラーが検出されたタスクID
- error_type
エラーの種類
ASAN_REPORT_FUNC
-
typedef void (*
ASAN_REPORT_FUNC
)(ASAN_ERROR_INFO *) 定義
typedef void (*ASAN_REPORT_FUNC)(ASAN_ERROR_INFO *);
SOLID_ASAN_Enabled
-
int
SOLID_ASAN_Enabled
(void) アドレスサニタイザが有効かを確認します。
- 戻り値
1: 有効
0: 無効
SOLID_ASAN_RegisterReporter
-
void
SOLID_ASAN_RegisterReporter
(ASAN_REPORT_FUNC reporter) - アドレスサニタイザのエラー検出時に呼ばれるレポート関数を登録します。レポート関数を登録した場合は、エラー内容がIDEの例外ウィンドウに表示されなくなります。レポート関数は、
ASAN_ERROR_INFO
へのポインタを引数に持つ関数です。- パラメータ
reporter -- エラー検出時に実行されるレポート関数
サニタイザエラーレポート関数の登録サンプル
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /* APIを使用するために必要なヘッダ */
#include "solid_asan.h"
static void my_asan_reporter(ASAN_ERROR_INFO *info)
{
const char *bug_desc = "Unknown error";
switch (info->error_type) {
case ASAN_ERROR_GLOBAL_OOB:
bug_desc = "Out-of-bounds access to global variable"; break;
case ASAN_ERROR_HEAP_OOB:
bug_desc = "Out-of-bounds access to heap memory"; break;
case ASAN_ERROR_STACK_OOB:
bug_desc = "Out-of-bounds access to stack"; break;
case ASAN_ERROR_USE_AFTER_FREE:
bug_desc = "Use after free"; break;
default:
break;
}
/* システムログにエラーメッセージを出力 */
syslog(LOG_INFO, "%s at addr: %x, access size: %d bytes",
bug_desc, info->access_addr, info->access_size);
}
void root_task(intptr_t exinf)
{
/* my_asan_reporter()をエラーレポート関数として登録 */
SOLID_ASAN_RegisterReporter(&my_asan_reporter);
/* ... 以下省略 */
}
|