0

アプリケーションの動作不良に取り組んでいます... 最近 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 つの異なるアイテムを割り当てる他の人が誰なのかわかりません。 . 問題は、この「バグ」の原因を追跡するために、他にどのような方法で調査し、より有用な情報を生成できるかということです。

4

0 に答える 0