V3226. Potential resource leak. The disposing method will not be called if an exception occurs in the 'try' block. Consider calling it in the 'finally' block.
Анализатор обнаружил освобождение неуправляемого ресурса, которое может не произойти из-за выброшенного исключения.
Пример:
public void ProcessStreamReader(....)
{
StreamReader sr = null;
try
{
sr = new StreamReader(Console.OpenStandardInput(), Encoding.UTF8);
string readString = sr.ReadLine();
IO.WriteLine(readString);
sr.Close();
}
catch (IOException exceptIO)
{
Console.WriteLine(exceptIO);
}
}
В данном случае разработчик хотел вызвать метод Close для освобождения ресурсов, которые использует объект. Если в блоке try будет выброшено исключение, то метод не отработает, и ресурс не будет очищен.
Исправленный код может выглядеть следующим образом:
public void ProcessStreamReader(....)
{
StreamReader sr = null;
try
{
sr = new StreamReader(Console.OpenStandardInput(), Encoding.UTF8);
string readString = sr.ReadLine();
IO.WriteLine(readString);
sr.Close();
}
catch (IOException exceptIO)
{
Console.WriteLine(exceptIO);
}
finally
{
if (sr != null)
{
sr.Close()
}
}
}
В исправленном варианте метод Close вызывается в блоке finally, поэтому метод будет вызван даже если в блоке try будет выброшено исключение.
Выявляемые диагностикой ошибки классифицируются согласно ГОСТ Р 71207–2024 как критические и относятся к типу: Ошибки утечек памяти, незакрытых файловых дескрипторов и дескрипторов сетевых соединений [* см. примечание касательно языков C#, Java]. |
Данная диагностика классифицируется как: