C 链表在执行过程中不复利

C 链表在执行过程中不复利,c,data-structures,linked-list,C,Data Structures,Linked List,我试图创建一个链表,在解析汇编代码文件时存储返回指令。作为对代码的解释,当遇到call指令时,将保存下一条指令的地址。当遇到返回指令时,链表应该被遍历,直到到达下一个节点为空的点为止。由于某些原因,代码没有保存返回地址。这可能和递归有关吗 //function to create a node in linked list struct ret_addr *return_address(cs_insn *insn, struct ret_addr *r) { struct ret_add

我试图创建一个链表,在解析汇编代码文件时存储返回指令。作为对代码的解释,当遇到call指令时,将保存下一条指令的地址。当遇到返回指令时,链表应该被遍历,直到到达下一个节点为空的点为止。由于某些原因,代码没有保存返回地址。这可能和递归有关吗

//function to create a node in linked list
struct ret_addr *return_address(cs_insn *insn, struct ret_addr *r) {
    struct ret_addr *ret = malloc(sizeof(*ret));
    ret->address = insn->address + insn->size;
    ret->nxt_ret_addr = r;
    return ret;
}

//retrieve the data from the last node of the linked list
int return_val(struct ret_addr *r) {
    if(r == NULL)
        return 0;
    while(r->nxt_ret_addr != NULL) {
        r = r->nxt_ret_addr;
        return r->address;
    }
}

//parse assembly code
struct bb_data *disassemble_function_cfg(int startAddr, unsigned char *bytes, int end_section) {
    csh handle;
    cs_insn *insn;
    cs_detail *detail;
    size_t count;
    int stop_disasm = 0;

    struct ret_addr *r_data = malloc(sizeof(*r_data));
    count = cs_disasm(handle, bytes, end_section, startAddr, 1, &insn);

    detail = insn->detail;
    for(int n = 0; n < detail->groups_count; n++) {
        if(detail->groups[n] == X86_GRP_CALL) {
            stop_disasm = 1;
            r_data = return_address(insn, r_data);
        }
        else if(detail->groups[n] == X86_GRP_RET) {
            stop_disasm = 1;
            start_edge = return_val(r_data);
        }

    if(!stop_disasm)
        disassemble_function_cfg(insn->address + insn->size, bytes + insn->size, end_section);
    else
        return edges;
}
在初始调用指令期间,返回值通过打印出来进行保存检查,但当到达返回指令时,链表突然变为空。我的想法是,这是由不断调用malloc造成的,但我不确定这是否是一个正确的假设

问题出在return\u val函数中:它不会修改调用方函数反汇编\u函数\u cfg中的r\u数据值

我还假设了一点:由于它是一个调用/返回实现,链表的行为应该像后进先出一样。return_address函数通过插入head来填充链表,因此return_val函数应该首先从head中删除地址:在达到NULL之前,不需要读取列表

请尝试以下代码:

//retrieve the data from the last node of the linked list
int return_val(struct ret_addr **r) {
    int ret_val;
    if (*r == NULL)
        return 0;
    ret_val = (*r)->address;
    *r = (*r)->nxt_ret_addr;
    return ret_val;
}
在调用者函数中:

    else if(detail->groups[n] == X86_GRP_RET) {
        stop_disasm = 1;
        start_edge = return_val(&r_data); // address of r_data, so it can be modified
    }

whiler->nxt\u ret\u addr!=空{r=r->nxt\u ret\u addr;返回r->address;}哈?[此函数应返回int]whiler->nxt\u ret\u addr!=空{r=r->nxt\u ret\u addr;return r->address;}此处有错误消息。相同内容打印了两次。我不明白,即使在对代码进行这些更改时,返回地址也是0。当在返回边之前的最后放入一个print语句时,程序会出错,我真的不知道start\u edge和edges是什么。根据您的代码,start\u edge将接收最后一个intvalue insn->address+insn->size。