Компилятор Delphi не предупреждает об этом коде

Отлаживая свой код, я заметил, что компилятор Delphi (Berlin 10.1) не предупреждает о функциях, которые не имеют возвращаемого значения. Это нормально?

Простой пример:

function f(s:string):String;
begin
  stringreplace(s,#32,'',[rfReplaceAll]);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
   showmessage(F('te st'));
end;

эта линия

 stringreplace(s,#32,'',[rfReplaceAll]);

Должно быть

result:= stringreplace(s,#32,'',[rfReplaceAll]);

Без предупреждения!

Я думаю, он должен предупредить, что "возвращаемое значение может быть неопределенным". Но это не так. Я изменил и переписал часть старых кодов в последние дни. Боюсь, у меня в заявке есть такая ошибка.


person Shahram Banazadeh    schedule 04.02.2018    source источник
comment
Вы пробовали это?   -  person user202729    schedule 04.02.2018
comment
@ user202729 Никаких предупреждений не отключал. также я получаю, что возвращаемое значение может быть неопределенным в других случаях.   -  person Shahram Banazadeh    schedule 04.02.2018
comment
Существуют некоторые статические анализаторы кода, которые могут помочь идентифицировать этот тип ошибок, см. Существуют ли какие-либо инструменты статического анализа кода для Delphi / Pascal?   -  person LU RD    schedule 04.02.2018
comment
@LURD Пробовал. У него есть несколько хороших функций и некоторые ошибки (например, включение закомментированной части кода в анализ, циклический varaibale не используется и короткое замыкание, если состояние обнаруживается неверно), но он также не распознает эти ошибки.   -  person Shahram Banazadeh    schedule 06.02.2018
comment
Было ли это FixInsight, как упомянул здесь в своем ответе @DavidHeffernan?   -  person LU RD    schedule 06.02.2018
comment
нет, я пробовал анализатор паскаль, буду тестировать и это.   -  person Shahram Banazadeh    schedule 06.02.2018
comment
@LURD Fixinsight нашел ЭТО!   -  person Shahram Banazadeh    schedule 06.02.2018


Ответы (1)


Это дефект компилятора. Возвращаемые значения управляемого типа реализованы как параметры var. Поэтому, как только компилятор преобразовал функцию в процедуру с дополнительным параметром var для возвращаемого значения, он видит параметр var, который, как он предполагает, был инициализирован вызывающей стороной. Это основная причина проблемы. Я не извиняюсь, это явный дефект, причем плохой. Я просто рассказываю, как это может произойти.

С этим мало что можно сделать. Возможно, самое лучшее, что вы можете сделать, - это убедиться, что ваш код имеет надежное покрытие для модульных тестов. Инструменты статического анализа, такие как FixInsight, также могут быть развернуты, чтобы помочь искоренить такие ошибки в вашем коде.

person David Heffernan    schedule 04.02.2018
comment
Я использую delphi berlin 10.1. (Я отредактировал свой пост, чтобы добавить эту деталь) Затем я думаю, что мне нужно снова прочитать мои измененные коды. и не пиши код, когда я такой сонный, Никогда! ;) Спасибо за ответ . - person Shahram Banazadeh; 04.02.2018
comment
@David: Нет, даже Tokyo 10.2.2 не предупреждает об этом, если тип результата управляется. Пробовал с динамассами и строками: без предупреждения. Целые или двойные числа: предупреждение. Так что ничего не изменилось. - person Rudy Velthuis; 05.02.2018
comment
FWIW: quality.embarcadero.com/browse/RSP-16880 - что касается поведения сам я думаю, что Аллен Бауэр однажды упомянул, что предупреждения генерируются на этапе после того, как создается список параметров, и поэтому не знает, что этот параметр var на самом деле является результатом функции, что довольно сложно исправить. - person Stefan Glienke; 05.02.2018
comment
@Stefan: Я предполагаю, что неназначенная проверка результата выполняется на этом более позднем этапе, а не только для генерации предупреждений. Но ISTM, если они действительно заботятся, они могут иметь флаг, который указывает, что определенный параметр должен быть результатом, и проверить это тоже. - person Rudy Velthuis; 05.02.2018