V3052. The original exception object was swallowed. Stack of original exception could be lost.


Анализатор обнаружил ситуацию, когда исходный объект перехваченного исключения не был использован приемлемым образом при повторной генерации исключения из блока catch. Из-за этого ряд ошибок превращается в трудноотлаживаемые, так как теряется стек оригинального исключения.

Рассмотрим несколько примеров некорректного кода. Первый пример:

public Asn1Object ToAsn1Object()
{
    try
    {
        return Foo(_constructed, _tagNumber);
    }
    catch (IOException e)
    {
        throw new ParsingException(e.Message);
    }
}

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

Корректный вариант кода:

public Asn1Object ToAsn1Object()
{
    try
    {
        return Foo(_constructed, _tagNumber);
    }
    catch (IOException e)
    {
        throw new ParsingException(e.Message, e);
    }
}

В исправленном варианте исходное исключение передается в качестве внутреннего, что полностью сохраняет информацию об исходной ошибке.

Рассмотрим второй пример:

private int ReadClearText(byte[] buffer, int offset, int count)
{
    int pos = offset;
    try
    {
        ....
    }
    catch (IOException ioe)
    {
        if (pos == offset) throw ioe;
    }
    return pos - offset;
}

В данном случае перехваченное исключение ввода/вывода генерируется повторно и полностью "затирает" стек оригинальной ошибки. Чтобы этого избежать, достаточно сделать переброс оригинального исключения.

Корректный вариант кода:

private int ReadClearText(byte[] buffer, int offset, int count)
{
    int pos = offset;
    try
    {
        ....
    }
    catch (IOException ioe)
    {
        if (pos == offset) throw;
    }
    return pos - offset;
}

Согласно Common Weakness Enumeration, потенциальные ошибки, найденные с помощью этой диагностики, классифицируются как CWE-390.

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V3052.


Найденные ошибки

Проверено проектов
361
Собрано ошибок
13 417

А ты совершаешь ошибки в коде?

Проверь с помощью
PVS-Studio

Статический анализ
кода для C, C++, C#
и Java

goto PVS-Studio;