アドレスサニタイザ
アドレスサニタイザの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/* APIを使用するために必要なヘッダ */
2#include "solid_asan.h"
3
4static void my_asan_reporter(ASAN_ERROR_INFO *info)
5{
6 const char *bug_desc = "Unknown error";
7
8 switch (info->error_type) {
9 case ASAN_ERROR_GLOBAL_OOB:
10 bug_desc = "Out-of-bounds access to global variable"; break;
11 case ASAN_ERROR_HEAP_OOB:
12 bug_desc = "Out-of-bounds access to heap memory"; break;
13 case ASAN_ERROR_STACK_OOB:
14 bug_desc = "Out-of-bounds access to stack"; break;
15 case ASAN_ERROR_USE_AFTER_FREE:
16 bug_desc = "Use after free"; break;
17 default:
18 break;
19 }
20
21 /* システムログにエラーメッセージを出力 */
22 syslog(LOG_INFO, "%s at addr: %x, access size: %d bytes",
23 bug_desc, info->access_addr, info->access_size);
24}
25
26void root_task(intptr_t exinf)
27{
28 /* my_asan_reporter()をエラーレポート関数として登録 */
29 SOLID_ASAN_RegisterReporter(&my_asan_reporter);
30
31 /* ... 以下省略 */
32}