小编典典

为什么编译器不能完全解决死代码检测?

all

我在 C 或 Java
中使用的编译器有死代码预防(当一行永远不会被执行时发出警告)。我的教授说,编译器永远无法完全解决这个问题。我想知道为什么会这样。我对编译器的实际编码不太熟悉,因为这是一个基于理论的课程。但我想知道他们检查了什么(例如可能的输入字符串与可接受的输入等),以及为什么这还不够。


阅读 138

收藏
2022-07-16

共1个答案

小编典典

死代码问题与停机问题有关。

Alan Turing
证明,不可能编写一个通用算法来给定一个程序,并能够决定该程序是否对所有输入都停止。您可能能够为特定类型的程序编写这样的算法,但不是针对所有程序。

这与死代码有何关系?

停止问题可以 简化 为查找死代码的问题。也就是说,如果您找到一种算法可以检测 任何 程序中的死代码,那么您可以使用该算法来测试 任何
程序是否会停止。由于这已被证明是不可能的,因此为死代码编写算法也是不可能的。

如何将死代码算法转换为停机问题算法?

很简单:在要检查是否停止的程序结束后添加一行代码。如果您的死代码检测器检测到该行已死,那么您就知道程序没有停止。如果没有,那么您知道您的程序停止了(到达最后一行,然后到达您添加的代码行)。


编译器通常会检查可以在编译时证明是死的东西。例如,依赖于可在编译时确定为假的条件的块。或 a 之后的任何语句return(在同一范围内)。

这些是特定情况,因此可以为它们编写算法。可以为更复杂的情况编写算法(例如检查条件在语法上是否矛盾并因此总是返回错误的算法),但仍然不能涵盖所有可能的情况。

2022-07-16