【问题标题】:What's the difference between "dead code" and "unreachable code"?“死代码”和“无法访问的代码”有什么区别?
【发布时间】:2014-05-13 05:16:08
【问题描述】:

我认为这些术语是同义词,但 MISRA 中关于死代码的注释表明这是错误的?有什么不同?一个是另一个的子集吗?

【问题讨论】:

  • 你能出示一下笔记吗?
  • "注意:无法执行的代码不是死代码"
  • 假设这是来自 MISRA-C:2012,请阅读附录 J。解释了死代码和无法访问的代码。

标签: standards standards-compliance misra


【解决方案1】:

死代码

执行无效功能的代码。基本上删除后不会有任何影响的东西。

无法访问的代码

由于其他逻辑而永远不会执行的代码。这通常是错误的迹象。

【讨论】:

    【解决方案2】:

    死代码 - 已执行但冗余的代码,要么从未使用过结果,要么对程序的其余部分没有添加任何内容。浪费 CPU 性能。

    function(){
        // dead code since it's calculated but not saved or used anywhere
        a + b;
    }
    

    无法访问的代码 - 无论逻辑流程如何都永远无法访问的代码。不同的是它没有被执行。

    function(){
        return x;
    
        // unreachable since returned
        a = b + c;
    }
    

    【讨论】:

    • 所以它们是不同的,一个不是另一个的子集?
    • @Lord_Gestalter 是的,它们在定义上是不同的。两者都是冗余代码,但它们冗余的原因是不同的。
    • 所以空语句';'不会是死代码或无法访问的代码,因为它没有执行但可以到达(取决于逻辑流程的其余部分)?
    • 这些定义与我使用术语的方式一致,但 dead code 有时用作 unreachable code 的同义词。相关维基百科文章:en.wikipedia.org/wiki/Unreachable_codeen.wikipedia.org/wiki/Dead_code
    • 这个答案似乎提出了一个比用法支持的更明确的答案。例如,请参阅 rust dead_code 警告,它会在未使用的函数上发出。 (doc.rust-lang.org/rust-by-example/attribute/unused.html)
    【解决方案3】:

    无法访问的代码

    在程序执行期间控制流从不进入的代码。无法访问的代码是在程序执行过程中从未执行的代码。

    死代码

    无论控制流如何通过程序,对后面的代码没有影响的代码。死代码是指在程序执行过程中不需要执行的代码,或者换句话说,是无用的。

    所以,实际上它们都不是另一个的子集。但是作为代码优化的一部分,编译器通常会在编译过程中删除无法访问的代码和死代码。

    【讨论】:

    • 本文中有一些令人困惑的重复在此文本中重复令人困惑;-)
    • 重复是为了传达一个额外的想法。所以,重复的文字中还有一个额外的想法。 ;-)
    • 啊,我明白了,但它有点难以获得(因为它是真实的代码);-)
    【解决方案4】:

    无法访问的代码是永远不会执行的东西,因为没有流程控制可以访问代码。

    死代码是可以(或可能)执行但其结果从未使用过的东西。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-26
      • 1970-01-01
      • 2015-05-30
      • 1970-01-01
      • 2011-01-19
      相关资源
      最近更新 更多