2016-12-04 2 views
1

多くのタイプ変換とキャスティングがある従来のcプロジェクトがあります。gccを使用してキャッチタイプのオーバーフローをキャッチ

組み込み関数:BOOL __builtin_add_overflow(TYPE1のA、TYPE2のB、TYPE3 * RES)

通常オーバーフロー動的挙動を確認するために、 gcc(及びC langは)そのための組み込み関数を定義します

結果がオーバーフローした場合、関数はtrueを返します。そうすれば、私のプログラムはこの状態に遭遇し、それに従って行動するかもしれない。

レガシーコードを変更せずに同じ機能を持たせるために、組み込み関数がtrueを返す場合、gccにそのような組み込み関数を使用させ、指定された関数をキャッチャーとして呼び出すことは可能ですか?私は、私のようなものを見つけることができます希望:

無効_cyg_add_overflow_catcher(A、B、__FILELINEを)。

GCCはすでにinstrument functionsです。トレーサビリティとプロファイリングのために、コンセプトは変わっていません。 アイデア

+1

あなたは単に[UBSan](http://developers.redhat.com/blog/2014/10/16/gcc-undefined-behavior-sanitizer-ubsan)を使用することはできますか? – yugr

答えて

2

これらの関数は、GCCによって効率的なasmシーケンスに下げられ、最終的なオブジェクトコードには存在しません。一方、UBSan modeでコンパイルされると、GCCはオーバーフロー時にlibubsan.soからの専用コールバックを呼び出します。これらのコールバックを実行可能ファイルでオーバーライドし、必要な処理を行うことができます(これはもちろんかなりハッキリです)。

GCCは、の符号付きの符号なしオーバーフローが標準で定義されているため、オーバーフローを追跡するだけです。

+0

UBSanについて私はよく知りませんでした。しかし、ベアボーンの実装についてはどうしたら報告されますか? –

+1

"ベアボーンCの実装についてはどうやって報告しますか?" - ブートローダのようなベアメタルプログラムでオーバーフローを検出したいのですか?その場合は、UBSanコールバックの実装を自分で行い、アプリにリンクする必要があります。これは[Linuxカーネル](https://kernel.org/doc/html/latest/dev-tools/ubsan.html)で行われています。 – yugr

関連する問題