0

私はassignメソッドを使用してベクトルに割り当てようとしていますが、同じコードがラップトップでsegfaultされますが、計算クラスターでは機能します。セグメンテーション違反は、次のように割り当てる呼び出しから発生します。

  double* val = mat.address_data();
  int* rp     = mat.address_major();
  int* cp     = mat.address_minor();
  // assign to the reserved location
  row_pointer_data.assign( rp,
                           rp+(m+1) );
  col_index_data.assign( cp,
                         cp+nz );
  value_data.assign( val,
                     val+nz );

ここで、matはMTL4行列であり、intおよびdoubleへのポインターを持つ内部データへのポインターを提供します。そして、これらのポインターは、それぞれnz double、m + 1整数、およびnz整数のブロックを指します。私は両方の環境でIntelC++コンパイラを使用していますが、すべてのコードは同じであり、bashシェルである両方のシェルのスタックサイズは無制限です。

ただし、col_index_data.assign()呼び出しは、私のラップトップでセグメンテーション違反を引き起こし、クラスターでは正常に動作します。

gdbまたはvalgrindを使用して、に関連する同じ行を指すと、メソッドを割り当てるための呼び出しで使用されるアセンブリコマンド_memmove_sse3()、つまり、

> #0  __memmove_ssse3 () at ../sysdeps/x86_64/multiarch/memcpy-ssse3.S:2928
> #1  0x000000000042df49 in VibroSys::read_triplet_data (mat=Traceback (most recent call last):   File
> "/home/utab/external_libraries/gdb_printers/python/mtl/printers.py",
> line 124, in to_string
>     A= empty_matrix(nr, nc)   File "/home/utab/external_libraries/gdb_printers/python/mtl/printers.py",
> line 38, in empty_matrix
>     return [copy.deepcopy(nr * ['0']) for c in range(nc)] MemoryError
> 
> , row_pointer_data=std::vector of length 19173284840251003, capacity
> 429530399489 = {...}, row_index_data=<error reading variable: Cannot
> access memory at address 0xa3bf88>, 
>     col_index_data=<error reading variable: Cannot access memory at address 0x100008>, value_data=std::vector of length 0, capacity
> 4764228, col_indices_on_row=Traceback (most recent call last):   File
> "/home/utab/external_libraries/stl_printers/python/libstdcxx/v6/printers.py",
> line 427, in children
>     rep_type = find_type(self.val.type, '_Rep_type')   File "/home/utab/external_libraries/stl_printers/python/libstdcxx/v6/printers.py",
> line 43, in find_type
>     field = typ.fields()[0] IndexError: list index out of range
> 
> std::map with 25701680 elements, is_symmetric=false) at
> /home/utab/vibroSys/src/boost_matrix_utilities.cc:354
> #2  0x000000000042e172 in VibroSys::extract_sub_matrix (input_matrix=Traceback (most recent call last):   File
> "/home/utab/external_libraries/gdb_printers/python/mtl/printers.py",
> line 124, in to_string
>     A= empty_matrix(nr, nc)   File "/home/utab/external_libraries/gdb_printers/python/mtl/printers.py",
> line 38, in empty_matrix
>     return [copy.deepcopy(nr * ['0']) for c in range(nc)] MemoryError
> 
> , sub_index1=std::vector of length 19173284840251003, capacity
> 429530399489 = {...}, sub_index2=<error reading variable: Cannot
> access memory at address 0xa3bf88>, sub_matrix=
>     <error reading variable: Cannot access memory at address 0x100000>) at /home/utab/vibroSys/src/boost_matrix_utilities.cc:995
> #3  0x000000000040f93a in main (argc=36433120, argv=0xa3c000) at timing_test.cc:145

2つの異なる環境での同じコードに対するこれらの2つの異なる動作の理由は何でしょうか?

4

1 に答える 1

0

2 番目のアーキテクチャでコンパイルするときに障害が見つかるのはよくあることです。バッファ オーバーフローを考えてみましょう。負の結果 (たとえば、重要なものを上書きしたり、領域外に出てセグ フォールトしたり) がなければ、おそらくその存在に気付かないでしょう。次に、別のマシンでは、実行可能ファイルが多少異なって配置され、オーバーフローが悪影響を与えるため、それに気づきます。

つまり、バグがあります。ある場所では表示されるが別の場所では表示されないという事実は、それがどこにでもあるバグではないことを意味するわけではなく、潜在的にマイナスの結果をもたらします。

于 2012-05-01T13:04:45.603 に答える