# V5008. OWASP. Classes should always be derived from std::exception (and alike) as 'public'.

Примечание. Данное диагностическое правило применимо только к языку C++.

Анализатор обнаружил класс, унаследованный от класса 'std::exception' (или аналогичных классов) через модификатор 'private' или 'protected'. Данное наследование опасно тем, что при непубличном наследовании при попытке поймать исключение 'std::exception', оно будет пропущено.

Ошибка часто возникает из-за того, что забывают указать тип наследования. В соответствии с правилами языка, наследование по умолчанию приватное. Как результат, обработчики исключений ведут себя не так, как задумывалось.

В качестве примера можно привести следующий некорректный код:

    class my_exception_t : std::exception // <=
    {
    public:
      explicit my_exception_t() { }
      virtual const int getErrorCode() const throw() { return 42; }
    };
    ....
    try
      { throw my_exception_t(); }
    catch (const std::exception & error)
      { /* Can't get there */ }
    catch (...)
      { /* This code executed instead */ }

Код, который должен будет перехватывать все стандартные и пользовательские исключения (catch (const std::exception & error)), не сможет отработать правильно, потому что приватное наследование исключает неявное преобразование типов.

Для того, чтобы код работал корректно, требуется добавить перед родительским классом 'std::exception' в списке базовых классов модификатор 'public':

    class my_exception_t : public std::exception
    {
      ....
    }

Данная диагностика классифицируется как:

CWE-544 OWASP-7.4.2