如何检查方法始终返回值

时间:2014-11-05 15:37:51

标签: compiler-construction compilation

我写了一个已经正常工作的编译器。它检查所有非void方法是否至少有一个return语句,但它不检查非void方法中的所有代码路径是否返回一个值。因此,例如,如果我有以下代码:

int function(bool a) 
{
     if(a){
         return 5;
     }
}

它将编译为“fine”,如果a为false,则控制将退出该函数并继续执行该函数下定义的任何内容。

我是否可以使用某些算法来执行此检查,以便始终知道方法是否始终返回值?或者我需要重新发明轮子?

1 个答案:

答案 0 :(得分:1)

功能不能脱离结束"并开始执行其范围之​​外的代码,无论它们是否返回值。允许对不返回结果的函数省略最后的return语句(或者在某些无纪律的语言中,即使对于返回结果的函数也是如此),但该函数需要返回所有情况。

鉴于此,为非空函数生成错误消息的最简单方法是:

  • 解析器在函数体的末尾插入return语句。

  • 死代码消除用于删除插入的return语句,以防万一。

  • Typechecking用于验证所有return语句(如果尚未删除,包括插入的语句)与函数的返回类型一致。 (也就是说,由于生成的return语句没有值,因此它只能与void函数一致。)

在这种情况下,您需要在类型检查之前删除不必要的return语句,否则您将收到大量不正确的错误消息。这需要一些控制流分析。

如果这样做太多,您可以在运行时通过在函数返回值的情况下将无值return语句编译为错误操作来发出错误消息。 / p>