用于查找C风格演员表的工具

有没有人知道我可以用来在代码中找到显式C风格的演员表的工具? 我正在重构一些C ++代码,并希望尽可能替换C风格的转换。

一个示例C风格的演员将是:

Foo foo = (Foo) bar; 

相比之下,C ++样式转换的例子是:

 Foo foo = static_cast(bar); Foo foo = reinterpret_cast(bar); Foo foo = const_cast(bar); 

如果你正在使用gcc / g ++,只需为C风格的强制转换启用警告:

 g++ -Wold-style-cast ... 

这种演员阵容难以搜寻的事实是新风格演员阵容首先被引入的原因之一。 如果你的代码工作正常,这似乎是一个相当无意义的重构 – 每当我修改周围的代码时,我只需将它们改为新式的转换。

话虽如此,你在C ++代码中使用C风格的强制转换这一事实表明代码存在问题应该修复 – 我不会做全局替换,即使这是可能的。

Offload C ++编译器支持将所有此类强制转换报告为编译时错误的选项,并将此类强制转换的语义限制为与static_cast更安全的等效。

相关选项包括:

 -cp_nocstylecasts 

编译器将在所有C样式转换上发出错误。 C ++代码中的C风格转换可能是不安全的,并导致不期望的或未定义的行为(例如,将指针转换为不相关的struct / class类型)。 此选项对于重构以查找所有这些强制转换并将其替换为更安全的C ++强制转换(如static_cast)非常有用。

 -cp_c2staticcasts 

编译器将C ++ static_cast的更受限制的语义应用于C样式转换。 打开此选项编译代码可确保C样式强制转换至少与C ++ static_casts一样安全

如果现有代码具有大量C样式转换并且将每个转换重构为C ++转换,则此选项非常有用。

搜索正则表达式\)\w给出了令人惊讶的好结果。

可以准确分析C ++源代码并执行自动定制更改(例如,您的替换版本)的工具是DMS软件重新设计工具包 。

DMS有一个完整的C ++解析器,构建AST和符号表,因此可以导航您的代码以可靠地找到C样式转换。 通过使用模式定向匹配和重写,您可以提供一组规则,将所有此类C样式转换转换为所需的C ++等效项。

DMS已被用于为波音和通用动力公司执行大规模的自动化C ++再造任务,每个任务涉及数千个文件。

C风格演员表的一个问题是,由于它们依赖于重载的括号,因此它们并不容易发现。 仍然是一个正则表达式(例如在Python语法中):

 r'\(\s*\w+\s*\)' 

是一个开始 – 它匹配括号中的单个标识符和括号内的可选空格。 但是当然不会捕获,例如, (void*)强制转换 – 以获得尾随星号,

 r'\(\s*\w+[\s*]*\)' 

你也可以从一个可选的const开始,进一步拓宽网络等等。

一旦你有一个好的RE,许多工具(从grepvim ,从awksed ,再加上perlpythonruby等)允许你应用它来识别你的源中的所有匹配项。

如果您使用某种匈牙利风格符号(例如iIntegerpPointer等),那么您可以搜索例如)p) p等等。

即使对于大型代码库,也应该可以在合理的时间内找到所有这些位置。

我已经用一个工具的描述回答了一次,如果你想要的话,它会找到并改变所有演员表。

如果您想要做的就是找到这样的演员阵容,那么还有另一种工具可以轻松实现这一点,事实上,这是对所有“正则表达式”建议的极端概括。 这是SD源代码搜索引擎 。 该工具使用户可以根据构成每种语言的语言元素搜索大型代码库。 它提供了一个GUI,允许您输入查询,查看单个命中,并通过单击鼠标在命中点显示文件文本。 再单击一下,您就可以在文件的编辑器中[对于许多编辑者]。 该工具还将在上下文中记录命中列表,以便您稍后重新访问它们。

在您的情况下,以下搜索引擎查询可能会获得大多数演员:

 '(' I ')' | '(' I ... '*' ')' 

这意味着,找到一系列令牌,首先是(,第二个是任何标识符,第三个是’)’,或者包含以’*’结尾的内容的类似序列。

您没有指定任何空白管理,因为该工具了解语言空白规则; 它甚至会忽略演员中间的评论,但仍然符合上述评论。

[我是提供此服务的公司的首席技术官。]

我在Visual Studio(2010)中使用此正则表达式在文件中查找搜索框:i\):i

感谢某人的灵感( 他的post )