是否有任何工具可以“找到参考”内置操作?

时间:2010-02-11 18:48:13

标签: c++ operators static-analysis

我正在阅读this item in the Google C++ style guide下的解释,这让我思考; 是否有任何工具可以像VS的“查找所有引用”工具一样工作,但是对于内置操作等等?例如说我想找到所有使用本地“+”运算符的地方指针(或者只是指向对象的指针)和整数,或者添加了有符号和无符号类型。

2 个答案:

答案 0 :(得分:2)

要确定哪些操作是“内置的”,您必须能够解析C ++,并确定每个子表达式,操作数的类型是什么。当操作数是char,int,long,float,double,pointer等类型的标量时,内置的ops是选择的。 (非内置函数名称和运算符标点符号已被用于在各种类定义中覆盖此类运算符。)

根据大多数人的标准来解析C ++非常困难。 “只是”一个解析器/词法分析器不会很快或很容易让你到达那里。真正困难的是解析名称的含义,确定名称的类型,然后确定各种子表达式的含义,因为你必须对C ++标准的数百页进行编码,这些页面描述了所有这些是如何工作的。你真正想要的是一个预先构建的C ++前端,它将随你的意愿而变化。

虽然GNU和MSVC拥有完整的C ++前端,但他们真的希望成为一个编译器,而且几乎不能被强迫帮助你。

DMS Software Reengineering Toolkit对于此任务非常理想。它旨在支持自定义分析工具的构建,并为许多标准语言提供完整的语言前端,包括C,Java,C#,COBOL ......最后是C ++。

DMS像编译器一样解析源文本,构建编译器数据结构(树,符号表等),并使这些文件主要由过程API提供,以允许您针对这些数据结构编写查询。

其中一个查询是“对于这棵树,哪种类型?”。使用它,可以非常直接地确定您是否具有“标准”运算符,例如integer-add。

编辑:(奇怪的是,在写完这个答案几天之后,我只得到一份小合同来识别C ++程序中的所有非内置运算符!)。

答案 1 :(得分:0)

我不知道这些工具,但是如果你有权访问解析器/词法分析器,那么原则上你可以创建这样的工具。我不太了解Visual Studio以及您编写自己的插件需要多少访问权限。应该可以使用eclipse或netbeans。如果您是emacs用户,请查看cedet。我目前正在搞乱它,使用语义数据库实现这样的工具似乎并不太难。