address sanitizer は malloc と free を置き換えることで double free や memory leak などの挙動を検出するツールです.
使い方
gcc にオプションを渡すだけで有効化できます.
g++ -fsanitize=address -fno-omit-frame-pointer -g test.cpp && ./a.out
int main() {
int *a = new int[10];
}
導入手順
CI で動かすことで main branch にはメモリリークなどがないままに保ちたいところですが,いきなり CI で動かすには既存の不具合を解消する必要があります.
しかし,実際に上記のオプションをつけてテストコードを実行してみたところ,かなり大量のエラーが出力されました.
具体的にはこのようなサマリが得られました: SUMMARY: AddressSanitizer: 2235751 byte(s) leaked in 18090 allocation(s).
これがソースコードの行数にしてどの程度のものかは不明なのですが,おそらくそれなりの量であり,すぐに address sanitizer を CI で動かすことはできなさそうです.
なので,まずは手元で動かしてエラーをつぶしつつ,いくつかの PR にわたって修正します.
そしてエラーが検出されなくなったら CI で address sanitizer を動かすという流れをとるというのがいま考えている案です.
address sanitizer は
mallocとfreeを置き換えることで double free や memory leak などの挙動を検出するツールです.使い方
gcc にオプションを渡すだけで有効化できます.
導入手順
CI で動かすことで main branch にはメモリリークなどがないままに保ちたいところですが,いきなり CI で動かすには既存の不具合を解消する必要があります.
しかし,実際に上記のオプションをつけてテストコードを実行してみたところ,かなり大量のエラーが出力されました.
具体的にはこのようなサマリが得られました:
SUMMARY: AddressSanitizer: 2235751 byte(s) leaked in 18090 allocation(s).これがソースコードの行数にしてどの程度のものかは不明なのですが,おそらくそれなりの量であり,すぐに address sanitizer を CI で動かすことはできなさそうです.
なので,まずは手元で動かしてエラーをつぶしつつ,いくつかの PR にわたって修正します.
そしてエラーが検出されなくなったら CI で address sanitizer を動かすという流れをとるというのがいま考えている案です.