如何检查所有代码路径是不是返回值

Posted

技术标签:

【中文标题】如何检查所有代码路径是不是返回值【英文标题】:How do I check whether all code paths return a value如何检查所有代码路径是否返回值 【发布时间】:2014-03-23 15:27:32 【问题描述】:

我正在为将在我的应用程序中运行的嵌入式脚本语言编写编译器。我目前正在研究编译器的语义分析部分。从理论上讲,我想知道如何检查给定脚本中的所有代码路径是否都会返回一个值。当并非所有代码路径都返回一个值(主要是 SO 问题)时,执行Google search 只会产生人们在自己的代码中看到错误的结果,因此我无法找到解释如何进行实际检查的来源。谁能指出我正确的方向?

注意: 如果可能的话,我正在专门寻找一个概述严格算法的权威来源。

【问题讨论】:

我认为应该提到的另一种方法是让 all 语句返回一个值。然后问题就设计好了。 @KubaOber 我曾考虑过这一点,但我更喜欢强制程序员使用 return 语句以减少编程错误的可能性。 【参考方案1】:

您可以通过对 AST 进行递归遍历来做到这一点。例如:

如果第一个语句在所有控制路径上返回或第二个语句在所有控制路径上返回,则语句序列在所有控制路径上返回。

如果“if”和“else”分支在所有控制路径上都返回或“if”语句始终为真,则 if 语句在所有控制路径上返回。

仅当“while”条件始终为真时,才在所有控制路径上返回 while 循环。

return 语句在所有控制路径上返回。

希望这会有所帮助!

【讨论】:

这很有帮助,谢谢。但我希望有一个更严格的算法,也许是 CS 教科书中的东西。我在 Dragon Book 和我拿起的其他编译器教科书中找不到任何内容。 我所描述的应该很容易转换为 AST 上的自上而下的递归下降,就像计算表达式的类型一样。 我认为它会很简单,但我正在寻找严谨。我想知道我正在实施的东西绝对坚如磐石。 如果您正在寻找权威参考,您可能应该更新问题以要求提供指向现有可信资源的链接。 @MrCodeMnky 如果你想要严谨,你可能想用形式语义来描述你的语言,然后你所追求的属性成为某种逻辑的证明。然后,您的问题会简化为在逻辑中进行证明之一,并且有多种技术可以用于此类证明,具体取决于所涉及的逻辑。您很可能会在语法树上进行结构归纳,例如here.

以上是关于如何检查所有代码路径是不是返回值的主要内容,如果未能解决你的问题,请参考以下文章

如何检查json数据数组是不是返回值

此函数是不是在所有控制路径上都有明确的返回值?

检查数组中的所有值是不是为真,然后返回一个真布尔语句(javascript)[重复]

Javascript/Jquery-如何检查函数是不是返回任何值?

Python 语法:如何检查返回值中是不是存在“x”?

检查数据库中是不是存在行,并返回布尔值