Regex 如何在Delphi(Win32)中查找硬错误接口强制转换

Regex 如何在Delphi(Win32)中查找硬错误接口强制转换,regex,delphi,Regex,Delphi,我试图在应用程序中发现一些神秘的错误,并相信原因可能是接口上的一些硬模式转换。例如,在Delphi中,这样的强制转换是不安全的 ISomeInterface(CurrentObj) 应该是哪一个 CurrentObj as ISomeInterface 鉴于缺少编译器警告,我认为应该为硬转换发出警告,我的问题是如何在代码库中轻松找到这些转换?也许是某种正则表达式grep搜索?代码库很大,手动搜索需要花费很长时间。如果您知道接口的名称,可以使用以下命令 “在文件中查找”对话框中的正则表达式 I

我试图在应用程序中发现一些神秘的错误,并相信原因可能是接口上的一些硬模式转换。例如,在Delphi中,这样的强制转换是不安全的

ISomeInterface(CurrentObj)
应该是哪一个

CurrentObj as ISomeInterface

鉴于缺少编译器警告,我认为应该为硬转换发出警告,我的问题是如何在代码库中轻松找到这些转换?也许是某种正则表达式grep搜索?代码库很大,手动搜索需要花费很长时间。

如果您知道接口的名称,可以使用以下命令 “在文件中查找”对话框中的正则表达式

ITest\([^)]+\)

其中,
ITest
是接口的名称

您不需要说明正在使用哪种风格的正则表达式。我将假设PCRE(Perl兼容的正则表达式),这意味着这些示例无法与IDE的Find对话框中的goofball“regular expressions”选项一起使用。然而,它们将与任何自尊的grep工具以及Perl、Ruby、.NET和许多其他语言中的内置正则表达式一起工作

您可以从以下内容开始:

\w+\s*\(
它将搜索一个或多个单词字符,后跟零个或多个空格,后跟一个开括号。这将符合:

TObject (Foo)
但根据您的正则表达式库、使用的选项以及将输入传递到其中的方式,如果在打开参数之前有换行符,则可能匹配或不匹配:

TObject
  (Foo)
如果中间有评论的话肯定不行,比如这个病理病例:

X := ISomeInterface // come back and look at this cast, it's dangerous
  (CurrentObj);
但对于大多数格式良好的代码来说,这就足够了

现在您的问题是,它不仅为您提供了类型转换,还为您提供了代码中几乎所有的方法调用。因此,需要进行一些改进

如果您的代码遵循典型的Delphi编码风格,那么这可能会更好:

\b[TIE][A-Z]\w+\s*\(
确保进行区分大小写的匹配。这将匹配任何有单词边界的地方,后跟大写T(大多数类和类型的传统前缀)或大写I(接口的前缀)或大写E(异常子体的前缀),后跟另一个大写字母,然后是一些大小写字母、数字或下划线,后跟可选空格和一个打开的paren。很有可能这就是你需要的


但是,如果您有任何类型名称不遵循通常的命名约定(例如,
TfcTreeView
,在t后面有一个小写字母),或者如果您曾经依赖Delphi的大小写不敏感(例如,如果您可能有类似
tobject(Foo)
甚至
tobject(Foo)
)的代码,然后就更难了。如果是这样的话,请发布一些详细信息,我也许可以提出建议。

不适用于嵌套参数,如
ITest(CreateMyObject(…)
。一旦你匹配了开放参数,它可能就足够好了。其他人已经解决了正则表达式的问题。关于警告:硬模式告诉编译器“忽略这是否安全;我知道我在做什么”。如果编译器警告您因为比它聪明而让编译器忽略某些内容,那将是毫无意义的。我想说,这只适用于类强制转换。界面强制转换永远都不正确,因此程序员显然不知道自己在做什么。