Почему здесь есть ошибка использования кучи? Я пытаюсь решить проблему LeetCode в C ++. Я не вижу никаких висящих указатC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Почему здесь есть ошибка использования кучи? Я пытаюсь решить проблему LeetCode в C ++. Я не вижу никаких висящих указат

Сообщение Anonymous »

Я пытаюсь решить LeetCode 2487: удалить узлы из Linked List, и я реализовал решение в C ++, которое сначала переворачивает список, затем удаляет узлы, которые имеют более высокий узел значения слева (который справа в правом Curr ;. Если я расстроен эту строку, программа сбои с помощью AddchSanitizer: ошибка без USE-USE-after.
Вот соответствующий код:
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* prev = nullptr;
ListNode* curr = head;

while (curr) {
ListNode* next = curr->next;
curr->next = prev;
prev = curr;
curr = next;
}

return prev;
}

ListNode* removeNodes(ListNode* head) {
head = reverseList(head);

int curMax = INT_MIN;
ListNode dummy(0);

dummy.next = head;
ListNode* prev = &dummy;
ListNode* curr = head;

while (curr) {
if (curr->val < curMax) {
ListNode* temp = curr->next;
prev->next = curr->next;
// delete curr; // uncommenting this line crashes
curr = temp;

} else {
curMax = max(curMax, curr->val);
prev = curr;
curr = curr->next;
}
}

return reverseList(dummy.next);;
}
};

Когда я комментирую Delete Curr; Как показано в фрагменте, решение принимается, но когда я его не допускаю, я получаю адрес ошибки Heap-use-use . После поиска и спросить LLMS, я пришел к выводу, что эта ошибка должна быть выброшена только в том случае, если упоминается место в освобождении памяти. Но я не думаю, что Prev-> Next является свисающим указателем. На самом деле исходный код был: < /p>
if (curr->val < curMax) {

prev->next = curr->next;
delete curr;
curr = prev->next;

}
< /code>
Но я изменил ее на реализацию выше при чтении о безопасности памяти и висящих указателях. Но это не решило проблему. Тем не менее, я считаю, что я не получаю доступ к Curr после удаления. Я не получил удовлетворительного ответа ни по LLMS, ни другим существующим вопросам здесь. Но нет, комментирует только одну отдельную строку, по-видимому, волшебным образом решает все ошибки. Я не ожидал этой ошибки, так как нет никаких висящих указателей или ссылки на местоположение освобожденных памяти. < /P>
Вот полное сообщение об ошибке: < /p>
Line 92: Char 9:
=================================================================
==22==ERROR: AddressSanitizer: heap-use-after-free on address 0x502000000058 at pc 0x55f6ddf45426 bp 0x7ffda50c2f00 sp 0x7ffda50c2ef8
READ of size 8 at 0x502000000058 thread T0
#0 0x55f6ddf45425 in __ListNodeUtils__::freeList(ListNode*&) (solution+0x1aa425)
#1 0x55f6ddf24101 in main solution.cpp:92:9
#2 0x7fd6afcce1c9 (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6)
#3 0x7fd6afcce28a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6)
#4 0x55f6dde4dc14 in _start (solution+0xb2c14)
0x502000000058 is located 8 bytes inside of 16-byte region [0x502000000050,0x502000000060)
freed by thread T0 here:
#0 0x55f6ddf224a2 in operator delete(void*, unsigned long) /root/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:155:3
#1 0x55f6ddf2482b in Solution::removeNodes(ListNode*) solution.cpp:92:17
#2 0x55f6ddf2409b in __helper__ solution.cpp:92:34
#3 0x55f6ddf2409b in main solution.cpp:92:46
#4 0x7fd6afcce1c9 (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6)
#5 0x7fd6afcce28a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6)
#6 0x55f6dde4dc14 in _start (solution+0xb2c14)
previously allocated by thread T0 here:
#0 0x55f6ddf2183d in operator new(unsigned long) /root/llvm-project/compiler-rt/lib/asan/asan_new_delete.cpp:86:3
#1 0x55f6ddf3c059 in ListNode* _Deserializer_::deserialize(rapidjson::GenericValue&, ListNode**) (solution+0x1a1059)
#2 0x55f6ddf3e472 in ListNode* _Deserializer_::deserialize(std::__cxx11::basic_string const&) (solution+0x1a3472)
#3 0x55f6ddf24051 in main solution.cpp:92:35
#4 0x7fd6afcce1c9 (/lib/x86_64-linux-gnu/libc.so.6+0x2a1c9) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6)
#5 0x7fd6afcce28a in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2a28a) (BuildId: 6d64b17fbac799e68da7ebd9985ddf9b5cb375e6)
#6 0x55f6dde4dc14 in _start (solution+0xb2c14)
SUMMARY: AddressSanitizer: heap-use-after-free (solution+0x1aa425) in __ListNodeUtils__::freeList(ListNode*&)
Shadow bytes around the buggy address:
0x501ffffffd80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x501ffffffe00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x501ffffffe80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x501fffffff00: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x501fffffff80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=>0x502000000000: fa fa fd fa fa fa fd fa fa fa fd[fd]fa fa fd fd
0x502000000080: fa fa 00 00 fa fa fd fd fa fa 00 00 fa fa fd fd
0x502000000100: fa fa fd fd fa fa fa fa fa fa fa fa fa fa fa fa
0x502000000180: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x502000000200: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x502000000280: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
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
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
==22==ABORTING


Подробнее здесь: https://stackoverflow.com/questions/795 ... ode-proble
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»