アドレスサニタイザ

アドレスサニタイザのAPIを使用するには、solid_asan.h をインクルードしてください。

#include "solid_asan.h"

ASAN_ERROR_TYPE

enum ASAN_ERROR_TYPE

アドレスサニタイザのエラータイプ

定数

enumerator ASAN_NOERROR

エラー非検出

enumerator ASAN_ERROR_GLOBAL_OOB

グローバル変数領域に対しての範囲外アクセス

enumerator ASAN_ERROR_HEAP_OOB

ヒープ領域に対しての範囲外アクセス

enumerator ASAN_ERROR_STACK_OOB

スタック領域に対しての範囲外アクセス

enumerator ASAN_ERROR_USE_AFTER_FREE

freeした領域に対してのアクセス

enumerator ASAN_ERROR_DOUBLE_FREE

二重free

ASAN_ERROR_INFO

typedef struct _ASAN_ERROR_INFO ASAN_ERROR_INFO
struct _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;

メンバー

const void *access_addr

アクセスされたアドレス

size_t access_size

アクセスサイズ

uintptr_t ip

エラー検出時に実行していた実行アドレス(PCの値)

int is_write

リードアクセスの場合は1, ライトアクセスの場合は0

int task_id

エラーが検出されたタスクID

enum ASAN_ERROR_TYPE 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}