//---------------------------------------------------------------------------
//      catch(const exception & err)
//      {
//         throw err;            // <- should be just "throw;"
//      }
//---------------------------------------------------------------------------
void CheckExceptionSafety::checkRethrowCopy()
{
    if (!_settings->isEnabled("style"))
        return;

    const char catchPattern1[] = "catch (";
    const char catchPattern2[] = "%var% ) { %any%";

    const Token* tok = Token::findsimplematch(_tokenizer->tokens(), catchPattern1);
    while (tok) {
        const Token* endScopeTok = tok->next();
        const Token* endBracketTok = tok->next()->link();

        if (endBracketTok && Token::Match(endBracketTok->previous(), catchPattern2)) {
            const Token* startScopeTok = endBracketTok->next();
            endScopeTok = startScopeTok->link();
            const unsigned int varid = endBracketTok->previous()->varId();

            if (varid > 0) {
                const Token* rethrowTok = Token::findmatch(startScopeTok->next(), "throw %varid%", endScopeTok->previous(), varid);
                if (rethrowTok) {
                    rethrowCopyError(rethrowTok, endBracketTok->strAt(-1));
                }
            }
        }

        tok = Token::findsimplematch(endScopeTok->next(), catchPattern1);
    }
}
Example #2
0
//---------------------------------------------------------------------------
//      catch(const exception & err)
//      {
//         throw err;            // <- should be just "throw;"
//      }
//---------------------------------------------------------------------------
void CheckExceptionSafety::checkRethrowCopy()
{
    if (!_settings->isEnabled("style"))
        return;

    const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase();

    for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) {
        if (i->type != Scope::eCatch)
            continue;

        const unsigned int varid = i->classStart->tokAt(-2)->varId();
        if (varid) {
            const Token* rethrowTok = Token::findmatch(i->classStart->next(), "throw %varid% ;", i->classEnd->previous(), varid);
            if (rethrowTok)
                rethrowCopyError(rethrowTok, rethrowTok->strAt(1));
        }
    }
}
//---------------------------------------------------------------------------
//      catch(const exception & err)
//      {
//         throw err;            // <- should be just "throw;"
//      }
//---------------------------------------------------------------------------
void CheckExceptionSafety::checkRethrowCopy()
{

    const SymbolDatabase* const symbolDatabase = _tokenizer->getSymbolDatabase();

    for (std::list<Scope>::const_iterator i = symbolDatabase->scopeList.begin(); i != symbolDatabase->scopeList.end(); ++i) {
        if (i->type != Scope::eCatch)
            continue;

        const unsigned int varid = i->classStart->tokAt(-2)->varId();
        if (varid) {
            for (const Token* tok = i->classStart->next(); tok && tok != i->classEnd; tok = tok->next()) {
                if (Token::simpleMatch(tok, "catch (") && tok->next()->link() && tok->next()->link()->next()) // Don't check inner catch - it is handled in another iteration of outer loop.
                    tok = tok->next()->link()->next()->link();
                else if (tok && Token::Match(tok, "throw %varid% ;", varid))
                    rethrowCopyError(tok, tok->strAt(1));
            }
        }
    }
}