segfault при назначении вектора из двух указателей

Я пытаюсь назначить вектор с помощью метода assign, однако тот же код дает сбой на моем ноутбуке, но работает на нашем вычислительном кластере. Segfault возникает из-за вызова assign like,

  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 );

где мат представляет собой матрицу MTL4, дающую указатели на свои внутренние данные с указателями на int и double. И эти указатели указывают на блоки из nz двойных чисел, m+1 целых чисел и nz целых чисел соответственно. Я использую компилятор Intel C++ в обеих средах, и весь код одинаков, и для обеих оболочек, то есть оболочки bash, размеры стека не ограничены.

Однако вызов col_index_data.assign() дает ошибку сегментации на моем ноутбуке, а в кластере все идет нормально.

Использование gdb или valgrind указывает на ту же строку, которая связана, я думаю, с командой сборки _memmove_sse3(), используемой в вызове метода assign, а именно:

> #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

В чем может быть причина этих двух разных действий для одного и того же кода в двух разных средах?


person Umut Tabak    schedule 01.05.2012    source источник
comment
Возможно ли, что какой-либо из этих методов возвращает NULL? Или +nz выходит за конец массива?   -  person hmjd    schedule 01.05.2012
comment
Запустите его под valgrind.   -  person Šimon Tóth    schedule 01.05.2012
comment
вы имеете в виду методы мата? судя по всему, есть нарушение прав доступа. Я проверил точно такой же код из репозитория, чтобы быть уверенным в том, что я делаю, и это меня озадачивает...   -  person Umut Tabak    schedule 01.05.2012
comment
Является ли мат сжатой двумерной матрицей?   -  person Vaughn Cato    schedule 02.05.2012
comment
Да, это сжатая 2D-матрица   -  person Umut Tabak    schedule 02.05.2012


Ответы (1)


Довольно часто обнаруживаются ошибки при компиляции на второй архитектуре. Рассмотрим переполнение буфера: если оно не имеет негативных последствий (например, перезапись чего-то важного или выход за пределы буфера и сбой сегментации), вы, вероятно, не заметите его существования. Тогда на другой машине исполняемый файл устроен несколько иначе, и переполнение действительно имеет негативные последствия, так что вы это замечаете.

То есть у вас баг. Тот факт, что он иногда появляется в одном месте, но не появляется в другом, не означает, что это не вездесущая ошибка, точка, с потенциально негативными последствиями.

person CodeClown42    schedule 01.05.2012
comment
Действительно, теперь я знаю об этом, но я еще не мог найти лекарство ;-) - person Umut Tabak; 01.05.2012
comment
Ну, вы, вероятно, не разместили достаточно кода, чтобы кто-то еще мог его найти. Например, значение m не ясно. Я не использовал MTL, но что делают эти функции? Вы их написали? И т.п. - person CodeClown42; 01.05.2012