Анализатор обнаружил освобождение неуправляемого ресурса, которое может не произойти из-за выброшенного исключения.
Пример:
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]. |
Данная диагностика классифицируется как: