Delphi (10,3 Rio) выдает ложные предупреждения H2077 для кода, подобного следующему:
x := TFoo.Create;
y := nil;
try
y := function_that_can_throw;
// use x and y
finally
x.Free;
y.Free;
end;
Примечание: предупреждение все равно будет нежелательным, даже если компилятор может доказать, что функция не может выдать, так как AFAIK существует невозможно заблокировать функцию, не выдавая ее, объявив ее nothrow
, как в других языках и , чтобы установить свойство nothrow
на сайте вызова. Следовательно, код должен быть написан в предположении, что функция может выдавать.
Я хотел бы подавить бесполезную / ошибочную подсказку, но, очевидно, невозможно специально подавить подсказку H2077, только все подсказки или их нет. Я хотел бы оставить включенные подсказки, если это возможно, поэтому мне интересно, есть ли другой вариант для подавления H2077 в этой ситуации.
Кроме того, я хотел бы избежать необходимости кодировать лишнюю секунду try
/ finally
frame, поскольку он загромождает исходный код и создает ненужный объектный код. Самая простая и наиболее очевидная альтернатива - вызов пустой фиктивной процедуры, такой как pretend_to_use(y)
, которая принимает параметр TObject и ничего не делает с ним - создаст ненужную глобальную зависимость и, скорее всего, также вызовы лишних функций. Поэтому я хотел бы получить ваш совет по лучшему решению ...
РЕДАКТИРОВАТЬ : оказывается, что Андреас имеет точку, а приведенный выше фрагмент не создает ложное предупреждение (специальное кодирование в компилятор?). Вот исправленный фрагмент кода, который вызывает нежелательную подсказку:
TIdStack.IncUsage;
y := nil;
try
y := function_that_can_throw;
// use y and the Indy stack
finally
TIdStack.DecUsage;
y.Free;
end;
В стеке Indy есть кое-что, над чем я сейчас работаю, но вход / выход из критических секций, возможно, был бы более распространенной ситуацией.