"安全"编程是否需要空的"else"语句?

Is an empty 'else' statement required for 'safe' programming?

本文关键字:else 语句 安全 编程 是否      更新时间:2023-10-16

我最近一直在阅读一些由MATLAB/Real Time Workshop从模型自动生成的代码,并阅读似乎是使用一些代码的非常奇怪的理由:

if (u <= x[bottom]) {
    retValue = bottom;
    returnStatus = 1U;
} else if (u >= x[top]) {
    retValue = top-1;
    returnStatus = 1U;
} else {
    /* else required to ensure safe programming, even *
    * if it's expected that it will never be reached */
}

似乎编码器在最后通过称之为"安全编程"来证明有一个空的"else"语句是合理的。除非有一些模糊的内存管理原因,否则它似乎是一个非常不必要的东西。

为什么它会在那里?

编辑:

我找到了完整的源代码,它实际上不是自动生成的,而是从rt_look.c复制的:

http://ecmc.rochester.edu/ecmc/docs/supercollider/scbook/Ch23_Dialects/extensions_c23_dialects/ENIAC/Eniac_Cycling%20Source%20Code/rt_look.c

考虑到您所展示的情况,当代码块永远无法到达时。我同意Shabaz的观点,因为它使得代码令人困惑。如果我在没有问题或主题的情况下阅读代码,我会想知道我错过了什么。如果您希望这部分代码发生变化,那么对于调试非常有用…但我认为一个好的老assert()也一样好。回答你的问题,我不认为空的 else语句有任何用途。

一些编码准则(例如MISRA)要求在else-if构造之后加上else-分支,否则它们将输出警告,因为有人可能忘记了这种情况。

说到一般的if-else块,没有必要有一个空的else块。不包含空的else块不会使代码变得更不安全,包含空的else块也不会使代码变得更安全。

查看您提供的代码,当u位于x[bottom]x[top]之间时,应该会遇到else块。你应该忽略这些值吗?注释表明,函数的用户必须确保u位于x[bottom]x[top]之间。如果您指望用户遵守该约束,我同意Sean Pedersen的观点,即else块中的assert()是一件很好的事情,可以在代码中强制执行假设。

一些编码标准要求作者添加默认和最终else子句,以确保编写代码的人考虑过如果代码不符合所有其他可能性会发生什么。它显然不会以一种或另一种方式影响程序,有空else或default,所以我不确定我是否同意调用安全编程。记录作者希望出现的失败并没有什么坏处,但这更多的是维护和文档增强。也许他们的想法是,如果作者必须发表评论,他们就会更多地考虑程序的结构,以减少在所有条件都不满足的情况下产生不良后果的风险。

我刚刚意识到我没有给出是或否。我的答案是否定的,因为它并不是保证程序安全所必需的。人们可以很容易地提出这样的论点,即它可以改进文档并导致对所有可能性进行更批判性的思考,但即使使用它,我也不知道如何对这样的问题回答是肯定的。