缓冲区溢出是与程序堆栈相关的唯一可能的错误吗?

Posted

技术标签:

【中文标题】缓冲区溢出是与程序堆栈相关的唯一可能的错误吗?【英文标题】:Is buffer overflow the only possible bug associated with program stack? 【发布时间】:2022-01-16 14:31:11 【问题描述】:

缓冲区溢出是与 C/C++ 程序堆栈相关的唯一可能的错误吗?在单线程/多线程 C/C++ 程序的程序堆栈中是否还会发生其他错误。

我正在阅读这篇关于并发错误的论文 (Learning from Mistakes — A Comprehensive Study on Real World Concurrency Bug Characteristics),并开始认为此类并发错误不会发生在堆栈中,因为它是线程私有的。

谢谢

【问题讨论】:

你对that paper(作者:Shan Lu、Soyeon Park、Eunsoo Seo 和 Yuanyuan Zhou)和堆栈使用有何关联?在提到堆栈跟踪时,它只包含一次“堆栈”一词。它不是对与程序堆栈相关的错误的研究。堆栈不是线程私有的;每个线程可能有自己的堆栈,但它们可以相互传递地址并通过这些指针使用彼此堆栈上的对象。 当您在专业或学术背景下提及论文或论文中的概念或信息时,请提供足够的信息以供其他人识别和定位该论文,例如参考书目(至少作者姓名,可能还有其他信息,如出版商、年份等)。 (“众所周知的”文档,如“C 标准”可以简单地通过名称来引用。)一个 URL 会很好,但它本身是不够的,因为 URL 会随着网站多年来的变化而中断。 另一类非常常见的错误涉及使用未初始化的堆栈分配对象,这会导致在插入或删除调试打印输出或在其他地方进行其他看似无关的更改时出现神秘的错误在程序中。 @EricPostpischil:谢谢,我编辑并链接到研究论文。我提到了这篇论文,因为并发错误看起来是多线程程序中的主要问题。所以想知道“程序堆栈”内存区域中是否可能出现此类错误。我完全理解您的指针访问是可能的,但是其中有多少是真实的,这意味着不是由于错误造成的。再次感谢 @SteveSummit 非常感谢。我将搜索这些类别。再次感谢 【参考方案1】:

您可以尝试使用过多的堆栈,这通常会导致分段错误(硬件报告程序已尝试访问未映射或未映射的访问类型的内存以及操作系统不通过更改内存映射来提供访问权限)。

您可能会错误地使用指针或数组索引(不仅仅是缓冲区溢出,还有朝另一个方向的“下溢”或其他不正确的地址计算),从而破坏堆栈,这可能会以多种方式改变程序执行,导致传输对不需要的位置进行程序控制或破坏数据并导致不需要的计算。

【讨论】:

以上是关于缓冲区溢出是与程序堆栈相关的唯一可能的错误吗?的主要内容,如果未能解决你的问题,请参考以下文章

堆栈缓冲区溢出会导致堆损坏吗?

系统在此应用程序中检测到基于堆栈的缓冲区溢出。溢出...

关于电脑!啥是“缓冲区溢出”?

打开电脑网页会弹出“堆栈溢出”,这是啥问题,怎么解决?求大神解答,谢了!

什么可能导致损坏:正常块错误后?

缓冲区溢出(vs)缓冲区溢出(vs)堆栈溢出[重复]