-1

この質問は私の前の質問の続編であり、現在のステータスは、@Employed Russian によって提案されたアドレスサニタイザーの出力を取得したことです。これは以下に示されています。アドレスサニタイザーを使用するのはこれが初めてなので、素朴で申し訳ありません。

==2596== ERROR: AddressSanitizer: stack-buffer-overflow on address 0x7fff89d67fd0 at pc 0x401f21 bp 0x7fff89d67d00 sp 0x7fff89d67cf8
READ of size 4 at 0x7fff89d67fd0 thread T0
    #0 0x401f20 (/home/ubuntu/tp+0x401f20)
    #1 0x405bac (/home/ubuntu/tp+0x405bac)
    #2 0x406d40 (/home/ubuntu/tp+0x406d40)
    #3 0x7fb5a7d6fec4 (/lib/x86_64-linux-gnu/libc-2.19.so+0x21ec4)
    #4 0x401278 (/home/ubuntu/tp+0x401278)
Address 0x7fff89d67fd0 is located at offset 320 in frame <TMV_multiplication> of T0's stack:
This frame has 13 object(s):
   [32, 60) 'A11_Upper_matrix'
   [96, 124) 'A_Upper_matrix'
   [160, 192) 'A11_Lower_matrix'
   [224, 256) 'A_Lower_matrix'
   [288, 320) 'VecA'
   [352, 384) 'VecB'
   [416, 448) 'VecC'
   [480, 536) 'result_A_Upper'
   [576, 632) 'result_C_Upper'
   [672, 732) 'matrix_A21'
   [768, 832) 'result_A_Lower'
   [864, 928) 'result_B'
   [960, 1024) 'result_C_Lower'
HINT: this may be a false positive if your program uses some custom stack unwind mechanism or swapcontext
  (longjmp and C++ exceptions *are* supported)
Shadow bytes around the buggy address:
0x1000713a4fa0: 00 00 00 00 00 00 00 00 00 00 00 00 f1 f1 f1 f1
0x1000713a4fb0: 00 00 f4 f4 f2 f2 f2 f2 00 00 00 04 f2 f2 f2 f2
0x1000713a4fc0: 00 00 00 00 f3 f3 f3 f3 00 00 00 00 00 00 00 00
0x1000713a4fd0: 00 00 f1 f1 f1 f1 00 00 00 04 f2 f2 f2 f2 00 00
0x1000713a4fe0: 00 04 f2 f2 f2 f2 00 00 00 00 f2 f2 f2 f2 00 00
=>0x1000713a4ff0: 00 00 f2 f2 f2 f2 00 00 00 00[f2]f2 f2 f2 00 00
0x1000713a5000: 00 00 f2 f2 f2 f2 00 00 00 00 f2 f2 f2 f2 00 00
0x1000713a5010: 00 00 00 00 00 f4 f2 f2 f2 f2 00 00 00 00 00 00
0x1000713a5020: 00 f4 f2 f2 f2 f2 00 00 00 00 00 00 00 04 f2 f2
0x1000713a5030: f2 f2 00 00 00 00 00 00 00 00 f2 f2 f2 f2 00 00
0x1000713a5040: 00 00 00 00 00 00 f2 f2 f2 f2 00 00 00 00 00 00
Shadow byte legend (one shadow byte represents 8 application bytes):
   Addressable:           00
   Partially addressable: 01 02 03 04 05 06 07 
   Heap left redzone:     fa
   Heap righ redzone:     fb
   Freed Heap region:     fd
   Stack left redzone:    f1
   Stack mid redzone:     f2
   Stack right redzone:   f3
   Stack partial redzone: f4
   Stack after return:    f5
   Stack use after scope: f8
   Global redzone:        f9
   Global init order:     f6
   Poisoned by user:      f7
   ASan internal:         fe
==2596== ABORTING

@Employed Russian が先に指摘したように、おそらく問題はスタックにあると思われます。では、このスタックの問題を解決するにはどうすればよいでしょうか。これらは私の頭の上にあるからです。

4

2 に答える 2

1

私は 3 つの unsigned int 配列を持ってX[16], Y[16], Z[16]mainます...
X[32]=Z[0]

ここで停止できます。

アクセスするための有効なインデックスXは 0 から 15 です。アクセスX[16](およびそれ以降) すると、未定義の動作が呼び出されます (何かが起こる可能性があります)。

に割り当てるという意味ではなかったと思いX[32]ます。あなたがおそらく意味したのは、それ&X[32]は と同じだということです&Z[0]。その場合、特に興味深いことはありません。配列はメモリ内に次々と配置されます。

0x000000008304ed6a in ?? ()

これは通常、スタックの破損を意味します (何かがリターン アドレスを上書きし、どこにも戻っていません)。Xローカル配列であると仮定すると、範囲外に書き込むと、そのような破損が発生する可能性が非常に高くなります。

このようなスタックの破損を見つける簡単な方法は、Address Sanitizer (Clang および GCC で使用可能) を使用することです。

アップデート:

Address Sanitizer エラーは、次のことを示しています。

  • には、32 バイト (おそらく)TMV_multiplication()のローカル配列があり、VecAint VecA[8];
  • その配列に範囲外でアクセス (読み取り) します (その配列の末尾を少し過ぎたところにあるオフセット 320 にアクセスしようとします)。

このエラーはクラッシュの原因ではありません。修正して、もう一度実行してください。この後もバグがあります。それらをすべて修正すると、プログラムはクラッシュしなくなります。

于 2016-04-07T03:24:53.437 に答える
0

アドレスサニタイザーの出力に感謝しますが、なぜソースを削除したのですか?

とにかく、私が間違っていなければ、出力には にアクセスがありVecA[8]、範囲外であることが示されます。

于 2016-04-08T11:44:38.550 に答える