Skip to content

Commit 5f3ddab

Browse files
Fix FP constParameter with std::map (cppcheck-opensource#3823)
1 parent 04b2a6f commit 5f3ddab

5 files changed

Lines changed: 26 additions & 9 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -465,7 +465,7 @@ $(libcppdir)/checkmemoryleak.o: lib/checkmemoryleak.cpp lib/astutils.h lib/check
465465
$(libcppdir)/checknullpointer.o: lib/checknullpointer.cpp lib/astutils.h lib/check.h lib/checknullpointer.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h
466466
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CPPFILESDIR) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(libcppdir)/checknullpointer.o $(libcppdir)/checknullpointer.cpp
467467

468-
$(libcppdir)/checkother.o: lib/checkother.cpp lib/astutils.h lib/check.h lib/checkother.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h
468+
$(libcppdir)/checkother.o: lib/checkother.cpp lib/astutils.h lib/check.h lib/checkclass.h lib/checkother.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h
469469
$(CXX) ${INCLUDE_FOR_LIB} $(CPPFLAGS) $(CPPFILESDIR) $(CXXFLAGS) $(UNDEF_STRICT_ANSI) -c -o $(libcppdir)/checkother.o $(libcppdir)/checkother.cpp
470470

471471
$(libcppdir)/checkpostfixoperator.o: lib/checkpostfixoperator.cpp lib/check.h lib/checkpostfixoperator.h lib/config.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/timer.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/valueflow.h

lib/checkclass.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2131,9 +2131,7 @@ bool CheckClass::isConstMemberFunc(const Scope *scope, const Token *tok) const
21312131
return false;
21322132
}
21332133

2134-
2135-
// The container contains the STL types whose operator[] is not a const.
2136-
static const std::set<std::string> stl_containers_not_const = { "map", "unordered_map" };
2134+
const std::set<std::string> CheckClass::stl_containers_not_const = { "map", "unordered_map" };
21372135

21382136
bool CheckClass::checkConstFunc(const Scope *scope, const Function *func, bool& memberAccessed) const
21392137
{

lib/checkclass.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,9 @@ class CPPCHECKLIB CheckClass : public Check {
188188
/** @brief Analyse all file infos for all TU */
189189
bool analyseWholeProgram(const CTU::FileInfo *ctu, const std::list<Check::FileInfo*> &fileInfo, const Settings& settings, ErrorLogger &errorLogger) override;
190190

191+
/** @brief Set of the STL types whose operator[] is not const */
192+
static const std::set<std::string> stl_containers_not_const;
193+
191194
private:
192195
const SymbolDatabase *mSymbolDatabase;
193196

lib/checkother.cpp

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "valueflow.h"
3333

3434
#include "checkuninitvar.h" // CheckUninitVar::isVariableUsage
35+
#include "checkclass.h" // CheckClass::stl_containers_not_const
3536

3637
#include <algorithm> // find_if()
3738
#include <cctype>
@@ -1502,11 +1503,21 @@ void CheckOther::checkConstVariable()
15021503
if (var->isReference()) {
15031504
bool callNonConstMethod = false;
15041505
for (const Token* tok = var->nameToken(); tok != scope->bodyEnd && tok != nullptr; tok = tok->next()) {
1505-
if (tok->variable() == var && Token::Match(tok, "%var% . * ( & %name% ::")) {
1506-
const Token *ftok = tok->linkAt(3)->previous();
1507-
if (!ftok->function() || !ftok->function()->isConst())
1508-
callNonConstMethod = true;
1509-
break;
1506+
if (tok->variable() == var) {
1507+
if (Token::Match(tok, "%var% . * ( & %name% ::")) {
1508+
const Token* ftok = tok->linkAt(3)->previous();
1509+
if (!ftok->function() || !ftok->function()->isConst())
1510+
callNonConstMethod = true;
1511+
break;
1512+
}
1513+
if (var->isStlType() && Token::Match(tok, "%var% [")) { // containers whose operator[] is non-const
1514+
const Token* typeTok = var->typeStartToken() ? var->typeStartToken()->tokAt(2) : nullptr;
1515+
const auto& notConst = CheckClass::stl_containers_not_const;
1516+
if (typeTok && notConst.find(typeTok->str()) != notConst.end()) {
1517+
callNonConstMethod = true;
1518+
break;
1519+
}
1520+
}
15101521
}
15111522
}
15121523
if (callNonConstMethod)

test/testother.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2746,6 +2746,11 @@ class TestOther : public TestFixture {
27462746
" T& g(C& c, T C::*f) { return c.*f; }\n"
27472747
"};\n");
27482748
ASSERT_EQUALS("", errout.str());
2749+
2750+
check("void f(std::map<int, int>& m) {\n"
2751+
" std::cout << m[0] << std::endl;\n"
2752+
"};\n");
2753+
ASSERT_EQUALS("", errout.str());
27492754
}
27502755

27512756
void constParameterCallback() {

0 commit comments

Comments
 (0)