少し(?)空いたけど続けます。回数的には追い付きたい。
あっちの界隈で少し前に言及されてた、GLIBCXX_DEBUGマクロについて知らなかったので。
(なんか、これのせいで時間掛かってTLEになるとかそういう)
GLIBCXX_DEBUGマクロとは
https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_macros.html
gccのオプションで、デバッグモードを有効にしてコンパイルする。これをしておくと、実行時にSTLを含む標準ライブラリのエラーチェックをしてくれて、問題が見つかるとアボートする。
使用例
バグのあるプログラム
#include<vector> int main() { std::vector<int> a(10); for(int i=0; i<=10; i++) a[i] = i; return 0; }
実行結果
/usr/include/c++/7/debug/vector:417: Error: attempt to subscript container with out-of-bounds index 10, but container only holds 10 elements. Objects involved in the operation: sequence "this" @ 0x0x7ffddf29c2c0 { type = std::__debug::vector<int, std::allocator<int> >; } Abort signal from abort(3) (SIGABRT)
オンラインコンパイラでも確認できました。
10要素しかないvectorのindex 10(つまり11番目)は範囲外だと教えてくれて止まる。ソースの場所とかは教えてくれない模様。「-g」の有無は影響しなさそう。
あと、ソートが前提のアルゴリズムを未ソートで呼んでも止めてくれるっぽい。へー
感想
Sanitizerの簡易版という感じでしょうか。ちょっとチェックしたい時とか、gccのバージョン的にSanitizerが使えない(自体は使えるけどundefinedが使えないとか)場合に良さそうです。なんか引っかかったら、Sanitizer他のちゃんとしたツールで調査したりとか。
おわり