如何在没有缓冲区溢出的情况下遍历链表?

Posted

技术标签:

【中文标题】如何在没有缓冲区溢出的情况下遍历链表?【英文标题】:How to iterate through a linked list without buffer overflow? 【发布时间】:2022-01-05 08:38:25 【问题描述】:

我写的

while (ptr->next != NULL) 
        //code here
        ptr = ptr->next;
    

并且 AddressSanitizer 正在引发堆缓冲区溢出错误。

我加了

if (ptr->next != NULL) 
    while (ptr->next != NULL) 
        //code here
        ptr = ptr->next;
    

希望它可能会避免读取未分配的地址,但现在 AddressSanitizer 正在使用 SEGV 终止我的程序。我不太确定如何解决这个问题,因为我是 C 编程新手,任何见解都会非常有帮助。谢谢!

【问题讨论】:

添加足够的代码让我们重新创建堆缓冲区溢出。 你检查过ptr是否不为空吗? 【参考方案1】:

你可以的

while(ptr != NULL) 
  // code
  ptr = ptr->next;

甚至

for(type* i = ptr; i != NULL; i = i->next) 
  // code

【讨论】:

一旦我们到达最后一个节点,这不会导致错误吗?最后一个元素不会有 ptr->next 最后一个元素仍然有ptr->next,它只是指向null。所以如果ptr等于null,你就到了结尾。 你说得对,我没有将最后一个元素设置为空。这就是我的问题所在。谢谢

以上是关于如何在没有缓冲区溢出的情况下遍历链表?的主要内容,如果未能解决你的问题,请参考以下文章

利用IAT导入表进行代码的注入

利用IAT导入表进行代码的注入

缓冲区溢出漏洞攻击原理

你好,java 向数据库添加大量数据时内存溢出 在不改变内存的情况下如何解决? 你当时是怎么解决的

c语言程序缓冲区溢出怎么办?

缓冲区溢出,sprintf而不是char调整大小? [重复]