ar.falsy.cat/content/note/info-tech/c-cpp-sanitizer.md
2023-08-14 21:23:15 +09:00

2.0 KiB
Raw Blame History

title tags
C/C++のsanitizerの使い方
note
info-tech
development
programming-language
howto

概要

  • バグを検知するコードを埋め込むためのsanitizerと呼ばれる機能がある
  • このページではsanitizerの使い方を説明する

使い方

コンパイル時にsanitizerを埋め込む

  • 種類ごとにオプションが異なる
  • XXXにはSanitizer名をカンマ区切りで羅列する
    • 代表的なSanitizer名については後述
g++ -fsanitizer=XXX a.cc
gcc -fsanitizer=XXX a.c

代表的なSanitizer

  • ここ-fsanitizer=を検索すると一覧が見れる
  • threadaddressundefinedと同居できない
名前 説明
address Address Sanitizer
undefined Undefined Behavior Sanitizer
thread Thread Sanitizer

実行時にsanitizerの挙動を指定する

  • sanitizerが埋め込まれたバイナリに対して実行時にsanitizerの挙動を環境変数で指定することができる
  • 詳細は各sanitizerの説明ページを参照

所感

  • threadが強すぎる
    • threadは実際にNf7のデバッグで使ってる
      • sanitizerがなければ気づけなかったcondition raceがかなりあった
        • 格好つけてロックフリーで書いたせい
  • threadaddressundefinedと一緒に使えないのが痛い
    • どちらともを使うには,threadでビルド,テストした後に,オプションを変えてビルドし直し,同じテストを実行しなければならない
  • 上に挙げた全てのsanitizerはm2 macbookで使えなかった
    • sanitizerの機能を含んだライブラリ(libubsanなど)が無いと言われてリンクに失敗する