编译时语义规则的执行

时间:2016-05-09 18:00:54

标签: c++ clang d semantics

编译器强制执行语法规则。我想要的是语义编译器,或普通编译器之上的语义阶段。

我不确定最好的方法。某些语言可能具有直接手段,某些语言可能允许您滥用"像模板一样强制执行它,最后,Clang允许非常强大的AST生成。但是我不知道有任何工具用它来强制执行任意规则。

我正在寻找一个强大的静态,(编译时)"上下文"检查器。

例如:我想确保(使用编译时警告或错误消息)已评估特定函数的返回值。非常简单,D论坛上有帮助的人提供了一些示例代码。

但其他规则怎么样?例如,在有人在调用先决条件初始化函数之前调用库函数时生成错误。 (*)当然,你可以产生异常。但是当问题本身就是静态的时候,不应该存在更优雅的编译时解决方案和系统吗?或者我减少到"弯曲"充满异国情调的模板伏都教的语言可以做我想做的事情吗?

(*)是的,这种情况可能需要动态检查。但它可能不取决于具体情况。就像在初始化之前使用变量一样。

我见过一些代码检查器可以做到最好的做法"扫描。他们中的任何一个(免费)是否支持自定义规则?它们是否对开发过程非常具有侵略性?理想情况下,我想要的只是"用户定义的语义规则,它们会产生编译错误或警告"当我去编译我的项目时。

P.S。我事先意识到有些人会宣称"代码执行"应该降级到代码指南,并且你不能强迫程序员遵守规则。但我并不是要求完美。我要求项目的首席开发人员能够使用编译器强制执行某些规则,这将迫使其他人注意这些规则何时被违反。

1 个答案:

答案 0 :(得分:3)

您想要的是可自定义的程序分析工具。

我的理解是,Clang可以做到这一点,并且有点设计使这相对容易。您可以自定义Clang以在代码上实现任意谓词;你在C ++ AFAIK中编写这些自定义。 Clang也可以充当编译器,因此您可以将它们集成到单个Clang图像中。

我的理解是你也可以用GCC来做这件事,但它不是为此而设计的,所以这样做通常在实践中要困难得多。 GCC MELT应该会让这更容易。恕我直言,它和GCC一样复杂,所以我看不出这有多大帮助。 YMMV。

第三种方法是使用专门设计用于支持此类定制的工具。我们的DMS Software Reengineering Toolkit及其C++ front end就是这种工具。您可以使用它来定义语义约束,使用source-level pattern matching和在符号表值/ C ++类型和方法本地控制和数据流分析上编码的任意谓词的组合。