アプリケーションの動作不良に取り組んでいます... 最近 g++-4.1 を g++-4.8 にアップグレードしましたが、一部のクラス インスタンスのプライベート メンバーと、メイン ソースでグローバルに定義された一部の変数との間でメモリ オーバーラップが発生しています。 .
gdb で書き込みをトラップし、変数ポインタを調べると、それらが同じメモリ アドレスを共有していることがはっきりとわかります。
4.8 で導入された -fsanitize=address を有効にすると、同じことがわかります。
================================================== =============== ==5160== エラー: AddressSanitizer: PC 0x4ba54f bp 0x7ffc0dc35df0 sp 0x7ffc0dc35de8 のアドレス 0x00000079750c でグローバル バッファ オーバーフローが発生しました 0x00000079750c スレッド T0 でサイズ 1 の WRITE #0 0x4ba54e (/opt/softplc/softplc+0x4ba54e) #1 0x4bd988 (/opt/softplc/softplc+0x4bd988) #2 0x4c1ea1 (/opt/softplc/softplc+0x4c1ea1) #3 0x4ba7c5 (/opt/softplc/softplc+0x4ba7c5) #4 0x409116 (/opt/softplc/softplc+0x409116) #5 0x511cfc (/opt/softplc/softplc+0x511cfc) #6 0x7fce6124de54 (/lib/x86_64-linux-gnu/libc-2.19.so+0x21e54) #7 0x409c24 (/opt/softplc/softplc+0x409c24) 0x00000079750c は、サイズ 8 のグローバル変数 'loopcounteryyyyyyy (softplc.cpp)' (0x797520) の左 20 バイトにあります。 'loopcounteryyyyyyy (softplc.cpp)' は ASCII 文字列です '' 0x00000079750c は、サイズ 8 のグローバル変数 'tod (softplc.cpp)' (0x7974e0) の 36 バイト右側にあります。 'tod (softplc.cpp)' は ASCII 文字列です '' バグのあるアドレスの周りのシャドー バイト: 0x0000800eae50: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0000800eae60: 00 00 ロガー スレッド PID= 5160 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0000800eae70: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 0x0000800eae80: 00 00 00 00 00 00 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eae90: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 =>0x0000800eaea0: f9[f9]f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaeb0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaec0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaed0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaee0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 0x0000800eaef0: f9 f9 f9 f9 00 f9 f9 f9 f9 f9 f9 f9 00 f9 f9 f9 シャドウ バイトの凡例 (1 つのシャドウ バイトは 8 つのアプリケーション バイトを表します): アドレス可能: 00 部分的にアドレス指定可能: 01 02 03 04 05 06 07 ヒープ左レッドゾーン: fa ヒープ ライト レッドゾーン: fb 解放されたヒープ領域: fd スタック左レッドゾーン: f1 スタック ミッド レッドゾーン: f2 スタック右レッドゾーン: f3 スタックの部分的なレッドゾーン: f4 リターン後のスタック: f5 スコープ後のスタック使用: f8 グローバルレッドゾーン: f9 グローバル初期化順序: f6 ユーザーによる中毒: f7 ASan 内部: fe ==5160== 中止しています
コードは非常に巨大で、問題を切り分けるためにコードの一部を切り取ろうとすると、重なっている領域が上に移動して消えてしまいます。
とにかく、すべてが静的に定義されており、ランタイムで定義されたインスタンスがないため、オーバーラップはコンパイラまたは gcclib の一種の間違いであると思います。または、同じアドレスに 2 つの異なるアイテムを割り当てる他の人が誰なのかわかりません。 . 問題は、この「バグ」の原因を追跡するために、他にどのような方法で調査し、より有用な情報を生成できるかということです。