acm-header
登录

ACM通信

实践

动态环境中的事后调试


错误说明

来源:加里·尼尔

许多现代动态语言缺乏理解复杂故障的工具。

这篇文章的全文是优质内容


评论


Berin Babcock-McConnell

谢谢你这篇有趣的文章。然而,我有一个关于坏代码示例的评论/问题。文章指出,“这个简单的程序有一个致命的缺陷:当试图在第1415行清除ptrs数组中的每一项时,它在数组之前清除了一个额外的元素(其中ii = 1)。”我同意越界访问和写入ptrs数组是不好的。然而,取消引用并写入一个未初始化的指针不是更大的问题吗?

我承认我不熟悉Illumos,我也不清楚这个例子是在什么硬件上运行的,但似乎写到ptrs数组下面的负索引可能只是要写到堆栈中当前不使用的区域(ptrs, ii,推寄存器,之前的堆栈帧等,都在ptrs[-1]之上)。然而,由于堆栈没有初始化*(ptrs[ii])将访问ptrs[ii]内存中的任何地址,并且*(ptrs[ii]) = 0;会尝试在这个地址上写一个0。这种尝试写入内存中的随机位置对程序的执行不是更致命吗?


大卫·帕切科

Berin,谢谢你的评论。是的,这个程序做了很多坏的事情,取消对数组元素之一的引用最终导致了崩溃。如果没有,那么破坏任意内存(通过写入数组的末尾或通过成功地取消对这些指针的引用)很可能会在稍后触发崩溃。在所有这些情况下,如果不进行某种内存转储(假设代码检查是难以处理的,因为在更现实的程序中会出现这种情况),几乎不可能找到bug的根源。


CACM管理员

以下信件发表在2012年4月的《中国计算机学会致编辑的信》(//www.eqigeno.com/magazines/2012/4/147353)中。
——CACM管理员

关于David Pacheco(2011年12月)的文章“动态环境中的事后调试”,我有一个关于本机环境部分的坏代码示例的问题,其中Pacheco说,“这个简单的程序有一个致命的缺陷:当试图清除ptrs数组中第1415行处的每个项时,它在数组之前清除了一个额外的元素(其中ii = 1)。”我同意对ptrs数组的越界访问和写入在某些情况下可能是致命的,但在这种情况下,写入未初始化的指针不就是致命的真正原因吗?

我不熟悉Illumos,也不知道这个例子是在什么硬件上运行的,但似乎写到ptrs数组下面的一个带负索引的地址可能只是写到堆栈中当前不使用的区域,因为ptrs, ii,推寄存器,以及之前的堆栈帧都可能存在于内存中ptrs[-1]以上的地址。然而,由于堆栈没有初始化,*(ptrs[ii])将访问ptrs[ii]处内存中的任何地址,而*(ptrs[ii]) = 0;将尝试将0写入该地址。这种尝试写入内存中的随机位置对程序的执行不是比写入堆栈中未使用的位置更有可能是致命的吗?

Berin Babcock-McConnell
东京

---------------------------------------------------

作者的回应

示例程序被故意破坏。如果取消对数组元素之一的引用没有立即使程序崩溃(运气好),那么所导致的内存损坏(无论是堆栈还是其他地方)可能会在稍后触发崩溃。在一个更现实的程序中(代码检查是不切实际的),如果没有更多的信息,调试这两个问题是没有希望的,这加强了丰富的事后分析工具是理解生产中这类问题的最佳方法的论点。

大卫·帕切科
旧金山


显示3评论

登录阅读全文

登录

如果您是ACM会员、通信订阅者或数字图书馆订阅者,则使用您的ACM Web帐户用户名和密码登录以访问优质内容。

需要访问吗?

请选择以下其中一个选项以访问优质内容和功能。

创建一个网络帐户

如果您已经是ACM会员,通信订阅用户,或数码图书馆订阅用户,请设立网上帐户,以便阅览本网站的优质内容。

加入ACM

成为ACM会员可以充分利用ACM卓越的计算信息资源、网络机会和其他优势。

订阅ACM杂志通讯

获得完全访问超过50年的CACM内容,并每月收到印刷版杂志。

购买物品

非会员可以购买这篇文章或它出现的杂志的副本。
登录全面存取
忘记密码? »创建ACM Web帐户
Baidu
map