2023-06-20 22:36:18 +00:00
|
|
|
|
---
|
|
|
|
|
title: C/C++のsanitizerの使い方
|
|
|
|
|
tags: [note, info-tech, development, programming-language, howto]
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
## 概要
|
|
|
|
|
- バグを検知するコードを埋め込むための,sanitizerと呼ばれる機能がある
|
|
|
|
|
- このページではsanitizerの使い方を説明する
|
|
|
|
|
|
|
|
|
|
## 使い方
|
|
|
|
|
|
|
|
|
|
### コンパイル時にsanitizerを埋め込む
|
|
|
|
|
- 種類ごとにオプションが異なる
|
|
|
|
|
- XXXにはSanitizer名をカンマ区切りで羅列する
|
|
|
|
|
- 代表的なSanitizer名については後述
|
|
|
|
|
|
|
|
|
|
```bash
|
|
|
|
|
g++ -fsanitizer=XXX a.cc
|
|
|
|
|
gcc -fsanitizer=XXX a.c
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
#### 代表的なSanitizer
|
|
|
|
|
- [ここ](https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html)で`-fsanitizer=`を検索すると一覧が見れる
|
|
|
|
|
- `thread`は`address`や`undefined`と同居できない
|
|
|
|
|
|
|
|
|
|
|名前|説明|
|
|
|
|
|
|:--|:--|
|
|
|
|
|
|`address`|[Address Sanitizer](https://github.com/google/sanitizers/wiki/AddressSanitizer)|
|
|
|
|
|
|`undefined`|[Undefined Behavior Sanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html)|
|
|
|
|
|
|`thread`|[Thread Sanitizer](https://github.com/google/sanitizers/wiki#threadsanitizer)|
|
|
|
|
|
|
|
|
|
|
### 実行時にsanitizerの挙動を指定する
|
|
|
|
|
- sanitizerが埋め込まれたバイナリに対して,実行時に,sanitizerの挙動を環境変数で指定することができる
|
|
|
|
|
- 詳細は各sanitizerの説明ページを参照
|
|
|
|
|
|
|
|
|
|
## 所感
|
|
|
|
|
- `thread`が強すぎる
|
|
|
|
|
- `thread`は実際に[Nf7](https://git.falsy.cat/nf7/nf7)のデバッグで使ってる
|
|
|
|
|
- sanitizerがなければ気づけなかったcondition raceがかなりあった
|
|
|
|
|
- 格好つけてロックフリーで書いたせい
|
|
|
|
|
- `thread`が`address`や`undefined`と一緒に使えないのが痛い
|
2023-08-14 12:23:15 +00:00
|
|
|
|
- どちらともを使うには,`thread`でビルド,テストした後に,オプションを変えてビルドし直し,同じテストを実行しなければならない
|
|
|
|
|
- 上に挙げた全てのsanitizerは,m2 macbookで使えなかった
|
|
|
|
|
- sanitizerの機能を含んだライブラリ(`libubsan`など)が無いと言われてリンクに失敗する
|