V1022. An exception was thrown by pointer. Consider throwing it by value instead.


Анализатор обнаружил исключение, брошенное по указателю. Чаще всего принято бросать исключения по значению, а перехватывать по ссылке. Бросание указателя может привести к тому, что исключение не будет поймано, так как перехватывать его будут по ссылке. Также использование указателя вынуждает перехватывающую сторону вызвать оператор 'delete' для уничтожения созданного объекта, чтобы не возникали утечки памяти.

Пример:

throw new std::runtime_error("error");

Корректный код:

throw std::runtime_error("error");

Конечно, само по себе бросание исключения по указателю не является ошибкой. Такое исключение можно правильно перехватить и обработать. Однако на практике это неудобно и провоцирует ошибки. Недостатки использования указателя:

  • Надо самостоятельно заботиться об уничтожении объекта, вызывая оператор 'delete'.
  • Нельзя использовать 'catch(...)', так как непонятно, как уничтожить объект.
  • Это нестандартный способ сообщить об ошибке, и другие части программы могут неправильно обрабатывать исключения.
  • Если кончилась динамическая память, то попытка создать новый объект с помощью 'new' также может окончиться неудачей.

Таким образом, бросание исключения по указателю можно считать ошибочным паттерном и такой код следует переписать.

Дополнительные ссылки:

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

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


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

Проверено проектов
346
Собрано ошибок
13 188

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

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

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

goto PVS-Studio;