假设我有一些巨大的程序P
我知道其中有一个错误:当我带参数运行它时A
它打印出丑陋的错误消息E
。在 shell 表示法中,会发生这种情况:
$ ./P A
E
$
现在我不知道是什么原因导致了这个错误,但它似乎是确定性的。我找到错误的方法是“隔离”它。我“减少”程序P
到仍然产生错误的“最小”版本E
给定论点A
。我所说的“减少”是指我将删除部分程序并手动内联函数,在每个阶段进行测试P A --> E
而不是成功响应或其他错误消息。一旦我无法再减少它,我有一个小程序可能会触及问题的核心。
这个过程相当机械:它不需要我太多的“洞察力”。感觉就像它可以自动完成:可能有一些程序X
其中,给定P
, A
, and E
,吐出最小的程序P'
这样P
减少到P'
and P' A --> E
.
那么,这个策略有名字吗?对于任何编程语言来说,它是否已经实现了某种意义上的自动化?
终于偶然发现了一些可以回答我问题的东西! https://news.ycombinator.com/item?id=8089359显然,这种技术被称为“减少”或“最小化”。看:
-
CReduce http://embed.cs.utah.edu/creduce/,它执行我所描述的简化的通用版本,特别是针对 C 程序。
-
Delta http://delta.tigris.org/,一个非常相似的程序。
-
DustMite https://github.com/CyberShadow/DustMite/wiki,另一个类似的程序,用于最小化 D 程序。
-
台达调试 https://www.st.cs.uni-saarland.de/dd/,一个描述一般过程的页面。
-
减少测试用例指南 https://gcc.gnu.org/wiki/A_guide_to_testcase_reduction在海湾合作委员会维基百科上。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)