您的位置:首页 > 编程语言

翻译《有关编程、重构及其他的终极问题?》——3.复制一次,检查两次

2016-11-20 21:45 253 查看

翻译《有关编程、重构及其他的终极问题?》——3.复制一次,检查两次

标签(空格分隔): 翻译 技术 C/C++

作者:Andrey Karpov

翻译者:顾笑群 - Rafael Gu

校验者:高国栋

最后更新:2016年11月20日

本书背景说明、总目录等介绍,可以跳转到以下链接进行查看:

http://blog.csdn.net/headman/article/details/53045891

欢迎大家转载,但请附上原作者以及翻译者的名字、原文出处,以尊重光荣的劳动者。

3.复制一次,检查两次

下面这段代码来自Audacity项目。PVS-Studio诊断后发现了错误:V501 There are identical sub-expressions to the left and to the right of the ‘-’ operator.(译者注:ztrend的赋值表达式sng中的见好两侧的值是一样的)

sampleCount VoiceKey::OnBackward(....) {
...
int atrend = sgn(buffer[samplesleft - 2] -
buffer[smaplesleft - 1]);
int ztrend = sgn(buffer[samplesleft - WindowSizeInt - 2] -
buffer[samplesleft - WindowSizeInt - 2]);
...
}


解释

“buffer[smaplesleft - WindowSizeInt - 2]”在表达式中自己减去自己。这个错误的出现是因为代码的拷贝问题(赋值-黏贴):这位程序员拷贝了一段代码,并且黏贴到后面,中间加了减号,却忘了把后面的2替换成1。

这是一个真的很平常的错误,但确实是因为失误所造成的。类似的错误对于程序员来说是非常具有现实讽刺性的(译者注:很多编译器很可能不报错,这个错误也很难被发现),这就是为什么我在这里说过几次的原因(译者注:#1的问题也有些类似)。我要想向这类的问题宣战。

正确的代码

int ztrend = sgn(buffer[samplesleft - WindowSizeInt - 2] -
buffer[samplesleft - WindowSizeInt - 1]);


建议

在复制代码使用的时候,要十分小心。

如果因为这个错误而建议禁止所有的方法的复制-黏贴是没有意义的,复制-黏贴太方便和高效了,应为太有用了,所以你看没有任何编辑器把这个功能去除掉。

但只要小心,不要太慌张就不会有这个错误——凡事预则立。

记住,使用复制的代码可能引起很多错误。这里,如果你看下所有被PSV-Studio诊断为V501的错误,你会发现一半都是因为使用复制-黏贴而导致。

如果你使用了复制的代码并编辑了他们,请一定仔细检查,不要偷懒!

我们将会在后面讲更多复制-黏贴的错误。虽然这个问题看上去很简单,但真的藏的很深,很难发现(译者注:编译器不报错,需要程序员仔细review代码或者debug代码才能发现),所以我不会让你忘掉它(译者注:作者在后面还会不断的啰嗦这个问题)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐