前言
这里记录一点工程性的东西:
1)以PHP bug为例,如何复现这样的真实、大型缺陷程序呢;
2)如何将开发者的补丁应用到缺陷程序中,修复复现出来的bug。
时间很紧,这里就随便记两笔吧。
1 复现bug
首先,PHP 有个bug tracking system,地址是:https://bugs.php.net/
有各种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。没问题了。
总结
还是要保持努力…
学习是很自然的事情
信息不全之处,有空补充。