今天的错误有品牌吗?仍然是我的流血心脏[徽标]

Code-Slinger Verity审查Groovy命名的开源安全性vulns的皮疹


st 鉴于持续的安全持有的远太开源状况,我决定召开Elcocc的紧急会议,主管编码人员El Reg委员会,审查发生了什么以及我们应该如何前进。

没有时间喋喋不休。安顿下来,并榨取PowerPoint投影机请埃里克。

Bug#1:转到失败

我最后一次在野外发现Goto是大约15年前。它被嵌入在一个C ++日期时间级,我懒洋洋地偷走了一定的代码共享网站,其中文件是在争议的WYGIWYD许可(您得到的是您所在的内容)。

使用Goto非常无偿。它像某些有毒昆虫采用的明亮着色一样照亮了源头,以警告鸟类不吃它们。而且,像最愚蠢的新鲜的突击一样,我吸入了黄蜂并忍受了后果。毋庸置疑,复制它会更快,更有趣 DIMMER灯泡的制定2002年日记 by hand.

因为 没有人 在真实代码中使用goto?当然,回到当天,唐纳德Knuth - 不是一个明显的尼格尔码风格的反动原则英雄 - 抨击了一个 快文 在防守。但这是在1974年,当数字手表仍然是一个非常整洁的想法时,吸烟的fags都很有趣,聪明,肯定 流行音乐的顶部 主持人Blah-di-Blah ugh。

所以 - 而且我相信你在我面前到了 - 当 转到失败ssl kerfuffle 发生了,你可以用弯曲的羽毛将我的gob砸到上周二。当然,我点击了所讨论的C文件的链接:去 这里 and scroll down to SSLVerifySignedServerKeyExchange to see for yourself, or 这里 为了成长分析。

或者,为了节省时间和多余的点球,在这个戏剧性的重建中占据雄鹿。看看你是否可以发现问题的行:

OSStatus SSLVerifySignedServerKeyExchange(/*loadsa params*/)
{
    /* Declare some local variables, including: */
    SSLBuffer       signedHashes;
    /* More mucking about with local variables, eg */
    signedHashes.data = 0;
    /* Then the main rhythm of the function: */
    if ((err = SSLImportantManInTheMiddleDefence(hashCtx, otherStuff)) != 0)
        goto fail;
    if ((err = SSLBitTwiddlingBogeymanBaffling(whatever)) != 0)
        goto fail;
    if ((err = SSLTumTittyTumTum(tum)) != 0)
        goto fail;
    if ((err = SSLNotForYourTinyBrainYouEarthling(params)) != 0)
        goto fail;
    if ((err = SSLAnotherFunctionYouDontUnderstand(hohoHo)) != 0)
        goto fail;
    /* ... */
    /* After many more lines of the same ilk: */
    if ((err = SSLYadaYadaYada(stuff)) != 0)
        goto fail;
        goto fail;
    if ((err = SSLDoTheActualImportantCheck(stuff)) != 0)
        goto fail;
fail:
    SSLFreeBuffer(&signedHashes);
    SSLFreeBuffer(&hashCtx);
    return err;
}

With its repeated goto fail refrain, the code's structure seems familiar. Ah yes, I know: the bawdy song 三名德国军官越过莱茵河。替代'Parlez-vous'的转到失败',你几乎可以吹口哨:

如果Err Equals Ess Ess Ell Tum-Tee-tum
  goto fail,
如果Err Equals Ess Ess Ell Tum-Tee-Dum
  goto fail...

重复的goto就像“西蒙说”这句话在“西蒙说”的游戏中:它只是为了绊倒你。它是一个无聊的,抽搐的风格。

程序员不应该对自己造成无聊,重复性的任务。这就是为什么他们与电脑交朋友。

这一点只是没有必要。尽管采取了非伴奏线 这一页,有更好的方法可以做到。

例如,代码维护者可以简单地将gotoS和代码删除,并使用嵌套的ifs。当然,他可能想把这个功能重构成较小的碎片,以避免他的逻辑结束,令人不舒服地痉挛,就像饥饿的孩子的脸上靠在一部心温温暖的电影中的餐厅窗口。但是什么?该计划可以使用一点额外的重组。

或者 - 这是宝宝的青睐解决方案 - 他可以打开他在那里的那个大型编译器的C ++交换机,并用一点保护他的资源 raii.。到那样,他的可怕杰出者成为快乐的回报。

读者: 你希望引起我的注意吗?

斯托: To the curious incident of the signedHashes variable in the body of the function.

读者,赌博伴随着游戏: But the signedHashes variable does nothing in the body of the function.

斯托,胜利: 这是一个好奇的事件。

Next page: BUG#2:GNUTLS

咬住它的手©1998-2021