NF

地方で働くプログラマ

6回目:GLIBCXX_DEBUマクロ

少し(?)空いたけど続けます。回数的には追い付きたい。


あっちの界隈で少し前に言及されてた、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他のちゃんとしたツールで調査したりとか。


おわり