gpt4 book ai didi

regex - 如何在 Delphi (Win32) 中查找硬错误接口(interface)转换

转载 作者:行者123 更新时间:2023-12-03 15:47:19 35 4
gpt4 key购买 nike

我试图在应用程序中找到一些神秘的错误,并相信原因可能是接口(interface)上的一些硬转换。例如,这种类型转换在 Delphi 中是不安全的

ISomeInterface(CurrentObj)

应该是

CurrentObj as ISomeInterface

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

最佳答案

您没有说明您正在使用哪种正则表达式。我将假设 PCRE(与 Perl 兼容的正则表达式),这意味着这些示例无法与 IDE 的“查找”对话框中的“正则表达式”选项一起使用。但是,它们可以与任何自重的 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(接口(interface)的前缀)或大写 E(异常后代的前缀),后跟另一个大写字母,然后是一些大写或小写字母或数字或下划线,后面是可选的空格和左括号。这很可能就是您所需要的。

但是,如果您有任何类型名称​​不遵循通常的命名约定(例如,TfcTreeView 后面有一个小写字母),或者如果您依赖 Delphi 的大小写不敏感(例如,如果您有可能拥有像 tobject(Foo) 甚至 Tobject(Foo) 这样的代码),那么它会变得更难。如果是这样,请发布一些详细信息,我也许可以提出建议。

关于regex - 如何在 Delphi (Win32) 中查找硬错误接口(interface)转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3517138/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com