| 1762 | } |
| 1763 | |
| 1764 | void CheckStlImpl::size() |
| 1765 | { |
| 1766 | if (!mSettings.severity.isEnabled(Severity::performance)) |
| 1767 | return; |
| 1768 | |
| 1769 | if (mSettings.standards.cpp >= Standards::CPP11) |
| 1770 | return; |
| 1771 | |
| 1772 | logChecker("CheckStl::size"); // performance,c++03 |
| 1773 | |
| 1774 | const SymbolDatabase* const symbolDatabase = mTokenizer->getSymbolDatabase(); |
| 1775 | for (const Scope * scope : symbolDatabase->functionScopes) { |
| 1776 | for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) { |
| 1777 | if (Token::Match(tok, "%var% . size ( )") || |
| 1778 | Token::Match(tok, "%name% . %var% . size ( )")) { |
| 1779 | // get the variable |
| 1780 | const Token *varTok = tok; |
| 1781 | if (tok->strAt(2) != "size") |
| 1782 | varTok = varTok->tokAt(2); |
| 1783 | |
| 1784 | const Token* const end = varTok->tokAt(5); |
| 1785 | |
| 1786 | // check for comparison to zero |
| 1787 | if ((!tok->previous()->isArithmeticalOp() && Token::Match(end, "==|<=|!=|> 0")) || |
| 1788 | (end->next() && !end->next()->isArithmeticalOp() && Token::Match(tok->tokAt(-2), "0 ==|>=|!=|<"))) { |
| 1789 | if (isCpp03ContainerSizeSlow(varTok)) { |
| 1790 | sizeError(varTok); |
| 1791 | continue; |
| 1792 | } |
| 1793 | } |
| 1794 | |
| 1795 | // check for comparison to one |
| 1796 | if ((!tok->previous()->isArithmeticalOp() && Token::Match(end, ">=|< 1") && !end->tokAt(2)->isArithmeticalOp()) || |
| 1797 | (end->next() && !end->next()->isArithmeticalOp() && Token::Match(tok->tokAt(-2), "1 <=|>") && !tok->tokAt(-3)->isArithmeticalOp())) { |
| 1798 | if (isCpp03ContainerSizeSlow(varTok)) |
| 1799 | sizeError(varTok); |
| 1800 | } |
| 1801 | |
| 1802 | // check for using as boolean expression |
| 1803 | else if ((Token::Match(tok->tokAt(-2), "if|while (") && end->str() == ")") || |
| 1804 | (tok->previous()->tokType() == Token::eLogicalOp && Token::Match(end, "&&|)|,|;|%oror%"))) { |
| 1805 | if (isCpp03ContainerSizeSlow(varTok)) |
| 1806 | sizeError(varTok); |
| 1807 | } |
| 1808 | } |
| 1809 | } |
| 1810 | } |
| 1811 | } |
| 1812 | |
| 1813 | void CheckStlImpl::sizeError(const Token *tok) |
| 1814 | { |