アドレスサニタイザ

アドレスサニタイザの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);

    /* ... 以下省略 */
}