Последняя строка неверной реализации - call freeList
.Но когда (рекурсивный) вызов завершится, он попытается вернуться к несуществующему коду после этой строки.Добавление инструкции ret
сделает код работающим, но обычно вы пытаетесь избежать этого, за исключением случаев отладки кода, в этом случае иногда помогает увидеть все промежуточные вызовы.Вместо этого вы можете упростить call freeList; ret
до простого jmp freeList
.
Пример отладки высокоуровневого кода:
function freeList(list) {
if (list) {
var next = list->next;
free(list);
freeList(next);
}
}
Если вы компилируете с оптимизацией, компилятор может захотеть написатьрекурсивный вызов freeList(next)
путем копирования next
в list
и выполнения jmp
, однако это уничтожит значение list
.Это означает, что когда вы пытаетесь отладить функцию, вы не можете сказать, какие элементы списка уже были освобождены.Поэтому вы можете отключить эту оптимизацию, когда пытаетесь отладить проблему в функции.