Как найти жесткие ошибочные приведения интерфейса в Delphi (Win32) - PullRequest
3 голосов
/ 19 августа 2010

Я пытаюсь найти какие-то загадочные ошибки в приложении, и считаю, что причиной могут быть некоторые жесткие преобразования в интерфейсах. Такие броски небезопасны в Delphi, например

ISomeInterface(CurrentObj)

, который должен быть

CurrentObj as ISomeInterface

В свете отсутствия предупреждений компилятора, которые, по моему мнению, должны выдаваться для жестких приведений, мой вопрос заключается в том, как легко найти эти приведения в базе кода? Может быть, что-то вроде поиска в регулярных выражениях? Кодовая база большая, и поиск ее вручную займет целую вечность.

Ответы [ 2 ]

6 голосов
/ 19 августа 2010

Вы не говорите, какой тип регулярных выражений вы используете.Я собираюсь предположить PCRE (Perl-совместимые регулярные выражения), что означает, что эти примеры не будут работать с опцией goofball «регулярные выражения» в диалоговом окне «Найти» в 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 (префикс для интерфейсов) или заглавная буква E (префикс для потомков исключений), за которым следует другая заглавная буква.буква, затем некоторое количество заглавных или строчных букв или цифр или подчеркиваний, за которыми следуют необязательные пробелы и открытое слово.Скорее всего, это то, что вам нужно.

Однако, если у вас есть имена типов, которые не соответствуют обычным соглашениям об именах (например, TfcTreeView, в которых строчная буква послеT), или если вы когда-либо полагаетесь на нечувствительность к регистру Delphi (например, если есть вероятность, что у вас когда-либо будет код, такой как tobject(Foo) или даже Tobject(Foo)), то это становится сложнее.Если это так, опубликуйте некоторые подробности, и я смогу внести предложения.

1 голос
/ 19 августа 2010

Если вы знаете имя интерфейса, вы можете использовать следующее регулярное выражение в диалоге поиска в файлах.

ITest\([^)]+\)

Где ITest - имя вашего интерфейса

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...