如何复现并修复一个缺陷(bug)程序

版权声明:如需转载或引用,请注明出处。 https://blog.csdn.net/weixin_39278265/article/details/84748693

前言

这里记录一点工程性的东西:
1)以PHP bug为例,如何复现这样的真实、大型缺陷程序呢;
2)如何将开发者的补丁应用到缺陷程序中,修复复现出来的bug。

时间很紧,这里就随便记两笔吧。

1 复现bug

首先,PHP 有个bug tracking system,地址是:https://bugs.php.net/

在这个网页: https://bugs.php.net/search.php?limit=30&order_by=id&direction=DESC&cmd=display&status=Open&bug_type=All&patch=Y&pull=Y

有各种bug,还都有对应的补丁。

我选择复现的是: Bug #74977

确定要复现的bug之后,接下来就开始复现了

1.1 先要下载对应版本的PHP

这个用git指令就好了,没什么好说的。
PHP在github上有版本库的,去下就ok。
git pull origin PHP-7.1.7
这是其中一个要用到的指令,其他的我都快忘了,,,
有空补充进来(在另外一台电脑上)

1.2 然后要顺利编译,运行PHP

一开始完全不懂php,也根本不知道怎么编译,运行,半天也没看到一个管用的readme。

反正就是各种摸索吧,也挺麻烦的

记起来了,是不断研究Prophet (来自MIT的自动修复工具) 的脚本,最后才知道,要:
./buildconf 这个操作是生成configure文件
./configure 这个操作是生成makefile(应该是吧)
make 这里是编译

make完之后,会提示你make test。这里就是运行所有测试用例了(非常多,1万个起步)

1.3 要设计PHP的失败测试用例,并成功运行(我记得这里最坑,比较麻烦)

我肯定不能每次都运行一万个测试用例,那多麻烦

此外,我还要把bug对应的错误(失败)测试用例给提取出来(对应网站:https://bugs.php.net/bug.php?id=74977)

提取出来之后写成一个独立的phpt文件,然后又研究prophet的脚本,

一顿研究下来,对应写了几个脚本(有空会补充)

然后就成功运行了指定的测试用例。

为什么说坑呢,
因为一开始研究的不是这个bug:
在复现Bug #77124 FTP with SSL memory leak的时候,一直有错误(Fatal error: Call to undefined function ftp_ssl_connect())百思不得其解,各方查找也没有答案,所以最后才转向了Bug #74977的复现

此外我还找个几个bug,都报这种Fatal error: Call to undefined function ××× 的错误,真的是扎心了。。。

为什么会这样呢?
有待研究。

2 修复bug

https://bugs.php.net/bug.php?id=74977 这里有这个bug对应的修复信息,
去找到,然后替换缺陷程序对应的版本中的代码。

然后重新
./buildconf
./configure
make
一遍。

然后再测试那个失败测试用例,发现通过了!

ok。没问题了。

总结

还是要保持努力…
学习是很自然的事情

信息不全之处,有空补充。

猜你喜欢

转载自blog.csdn.net/weixin_39278265/article/details/84748693