gpt4 book ai didi

读取垃圾内存会破坏程序流程吗?

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:09 25 4
gpt4 key购买 nike

在我的应用程序中,我有一对嵌套循环,它们遵循类似嵌套的链表以解析数据。我犯了一个愚蠢的错误,将一个结构作为子结构,例如:

if (((ENTITY *) OuterEntityLoop->data)->visible == true) {

代替:

if (((ENTITY_RECORD *) OuterEntityLoop->data)->entity->visible == true) {

这导致了一个问题,即大约 70% 的运行会导致应用程序完全停止 - 不是崩溃,只是坐着和旋转。程序流中的诊断 printf 会以奇怪的顺序触发或根本不触发,尽管它在大多数情况下会自发恢复几次,但它会破坏应用程序。

事情是这样的。即使在将内部逻辑削减到绝对不是基于逻辑错误的无限循环,到循环包含我的printf的地步,它仍然是坏了。

第二件事:当结构被错误识别时,如果我试图访问一个不存在的属性,即使它没有 extant 属性,它仍然会报错。

我的问题是:

  1. 为什么会损坏内存?可以简单地读取垃圾内存破坏程序的控制结构吗?如果不是,这是否意味着即使 Electric Fence 不再提示,我的某处仍然漏电?
  2. 我假设它提示不存在属性的原因是因为它遵循给定的类型定义,而不是实际存在的类型。既然我已经把它打出来了,这在我看来就不那么值得怀疑了,但我想确认一下我在这里没有偏离基地。

最佳答案

真的不知道当程序访问无效内存时会发生什么,即使是为了读取。在某些系统上,任何内存读取操作要么有效,要么导致程序立即崩溃,但在其他系统上,错误读取可能会被误解为执行某项操作的信号。您没有指定您使用的是 PC 还是嵌入式系统,但在嵌入式系统上通常有许多设计地址,这些地址在读取时会触发各种操作 [例如从串口接收数据出队,或确认中断];错误读取此类地址可能会导致串行数据丢失,或者可能会导致中断 Controller 认为中断已被处理,但实际上并未处理。

此外,在某些嵌入式系统中,尝试读取无效地址可能会产生其他更糟糕的效果,这些效果并非真正有意设计,而是偶然发生的。例如,在我设计的一个系统上,我必须连接一个存储设备,该设备在读取周期后离开总线的速度有点慢。如果下一次内存读取是从至少有一个等待状态或在不同总线上的内存区域执行的,就不会有问题。但是,如果在快速外部存储器分区中运行的代码试图读取该区域,则存储器设备无法快速脱离总线将破坏下一条获取指令的某些位。所有这一切的最终结果是,从位于某些地方的代码访问慢速设备没有问题,但是从位于快速分区中的代码访问它(有意或无意)会导致奇怪且不可重现的故障。

关于读取垃圾内存会破坏程序流程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19970536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com