Как устранить эту ошибку сегментации в моей программе с помощью следующего вывода Address Sanitizer?
Этот вопрос является продолжением моего предыдущего вопроса, и в настоящее время я получил вывод средства для очистки адресов, предложенного @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, проблема, скорее всего, связана со стеком. Теперь, как решить эту проблему стека? Потому что это над моей головой.
2 ответа
У меня есть три неподписанных массива 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 говорит вам, что
- В
TMV_multiplication()
, у вас есть локальный массивVecA
32 байта (возможноint VecA[8];
) а также - Вы обращаетесь (читаете) к этому массиву за пределами (пытаясь получить доступ к смещению 320, которое находится за концом этого массива).
Эта ошибка не является причиной вашего сбоя. Вы должны исправить это и запустить снова. Есть больше ошибок после этого. Как только вы исправите их все, ваша программа перестанет работать.
Спасибо за вывод адреса sanitizer, но почему вы удалили источник?
Во всяком случае, если я не ошибаюсь, вывод говорит вам, что есть доступ в VecA[8]
это вне диапазона.