所以也就在三天后,萧天就已经完成了这个功能的编程,当然也是离不开他的熬夜历程。
所以在提交悬赏之后,萧天终于是松了一口气,他也觉得新能力不错,是时候得筹备自己的公司了。
而另一边,天井市,羽然科技公司。
钱志海就利用这个功能,便通知相关项目组,让他们在自己的项目开头importdebugtools。
刚好有个测试任务。
所以没一会儿,他们就排查到了因为这个功能而意外收获的另外一个辅助库的bug。
钱志海等几人大眼瞪小眼。
尤其是李明,用目瞪口呆都不为过,“这个功能怎么像个利器一样啊,我们没有找他,他都额外的给我们发现了辅助库另外的漏洞。”
钱志海也是心中一动,他非常的想把这个天天给拉到他们的公司来,这妥妥的都是大公司精英级别的程序员啊!
他们这个小公司虽然发展的也还行,但是也仅仅是还行罢了,如果能够让天天加入他们,钱志海相信他们的公司绝对能够再创一个新高!
但是……
像天天这样的大神,工资肯定是很高的,就比如那些大公司里面的精英程序员,月入十万都是保底,而且还有奖金分红,而他钱志海能拿出什么来笼络天天大神呢?
不说其他的,就光一个月薪十万,钱志海就拿不出手,也不是说出不起,只是公司还有其他方方面面也要打点,这十万一拿,他们的现金流就更加的不便了。
所以,想要邀请天天大神,钱志海也就只能在心里面想一想,不过他还是看了一眼自己的这几个骨干程序员,“天外有天,人外有人,我们还需要努力啊。不过现在既然发现了这个bug,那就赶紧给它解决吧。”
几个人顿时开始来修复漏洞,首先拿到调用栈信息之后,一会儿时间就很容易的追查到了根源。
钱志海一行人看着这个,都是有些面面相觑。
“怎么是这个……”
这是当年羽然科技公司实现时的疏忽:在某个函数中,他们声明了一个局部变量,这个变量和同一命名空间的另一个变量名字极为相似,但命名风格(首字母是否大写之类)和其他代码不太一致。
当时他们是为了规避不同作用域的命名冲突才这样命名的。
但到了后面,他们仍然习惯性的用了“正常”的命名,也可能是选错了编辑器自动提示选项。
这就相当于丢开局部变量,用了命名空间的外部变量;但从上下文看,这里就不应该碰外部那个同名变量。
用伪码表示大概是这样:
classoneclass{
packagenameitems=null
....
voidfunname1(arg){
//initialpackagenameitems
packagenameitems=arg
//other...
}
stringfunname2(){
packagenameitems=extractpureinfo(packagenameitems)
//dosth
....
resu=getitemfrom(packagenameitems,itemname)//1
//dosth
....
returnresu
}
}
从那里分析,在//1处,本应该是从已经解包过的packagenameitems中,取它的第n项;但这里误传入了解包前的packagenameitems。
似乎输入文本可能会发生几种情况,当然多数情况不需要进一步处理,直接用外部那个变量就行,此时两个变量内容一致,不会触发bug;但少数情况下,外部那个变量需要进一步处理,这才能提取到正确的内容。
这种情况下,两个变量内容不同,误用了前一个变量就读不到正确数据了。
这是个极为隐蔽的逻辑错误。
其实和变量作用域相关的故障都很隐蔽。
李明拿着整个调用链的详细记录,也是看了好几遍才发觉这两个变量的名字似乎有些意思,这才沿着这条线追查下去……
总之,意外的输出信息弄得他们一脸懵逼,因为这时候根本就不应该有这种信息,也幸好检查条件设的比较窄,只有正常返回可通过,其他一概抛异常崩掉——于是这个异常就被叶新晨的debug工具抓到,自动记录了调用栈信息。
所以说为什么之前钱志海等几人会惊讶,因为这个功能给他们抓到了一个bug。
还好这是个极为简单的bug,只需把最后那次访问时,首字符小写的变量名改成大写,故障就不再复发。
其实就这么简单个首字符大小写搞错、误访问了外部变量的bug,羽然科技公司在黑土平台上的悬赏单也是挂了有两三年了,前前后后换了很多人经手,但就是没人能抓到它。
最终,这个简单又奇葩的bug竟然被天天大神的一个功能给抓住了。
不得不说这真的是意外之喜。
“真想见识见识天天这样的大神是什么样的……”
………