SANRAZOR: Reducing Redundant Sanitizer Checks in C/C++ Programs[OSDI’21]

github: https://github.com/SanRazor-repo/SanRazor

概要

“冗長”なsanityチェック

「理想的」なsanityチェックの冗長判定

以下の条件が成立するとき,sanityチェックcは”冗長”である:

Ex) “冗長”なsanityチェック

// c': check arr[i]
if (i > arr_size) report();
k = arr[i];
// c: check arr[i]
if (i > arr_size) report();
arr[i] = k + 1;

「近似的」なsanityチェックの冗長判定

以下のように冗長判定を近似する:

SANRAZOR: “冗長”なsanityチェックの削除

ステップ:

  1. 制御: Workloadの実行 + Profilingにより,Dominatorを求める
  2. 意味: 静的解析により,チェックするデータが同じかを判定する
  3. 冗長なsanityチェックの削除

提案手法の特徴

1. 制御: Dominatorを求める

ステップ:

  1. 全てのbr命令に対して,実行回数をカウントするように計装
  2. Workload(test suite)を実行して,Profile情報を取得
  3. br命令の実行回数,分岐先が求まる

Dominatorと判定する条件:

全実行回数が一致:

ユーザーチェックと一致:

2. 意味: チェックするデータが同じかを判定する

ステップ:

  1. br命令のオペランドをデータ依存グラフで表現
  2. 3つの戦略で,データ依存グラフに対して同値判定

Ex)

// c': check arr[i]
if (i > arr_size) report();
k = arr[i];
// c: check arr[i]
if (i > arr_size) report();
arr[i] = k + 1;

同値判定における3つの戦略:

Ex)

// c': check arr[i]
if (i > arr_size) report();
k = arr[i];
// c: check arr[i]
if (i + 1 > arr_size) report();
arr[i + 1] = k + 1;

L0の場合: 不一致

L1の場合: 一致

L2の場合: 一致

3. 冗長なsanityチェックの削除

上記で求めた2つの条件を両方とも満たすsanityチェックを”冗長”と判定し削除:

Ex) sanityチェックcは冗長 (分岐実行回数が一致 & データ依存グラフが一致)

// c': check arr[i]
if (i > arr_size) report();
k = arr[i];
// c: check arr[i]
if (i > arr_size) report();
arr[i] = k + 1;

実験結果

RQ1. 実行時間オーバーヘッドの削減

検体: SPEC CPU2006ベンチマーク

Sanitizer Full L0 L1 L2
ASan 73.8% 62.0% 35.8% 28.0%
UBSan 154.3% 124.4% 94.7% 36.6%

RQ2. バグ検知能力

検体: 10のリアル検体(38のCVE)
既存研究: ASAP[SP’15] (実行回数の多いhotなsanityチェックを削除)
結果: L2において,33のバグを検出

自分の研究との関連