Skip to content

Commit 41bd28c

Browse files
Fix #12087 Library: add Container::Action::FIND_CONST (#5579)
1 parent b61feaf commit 41bd28c

8 files changed

Lines changed: 18 additions & 9 deletions

File tree

cfg/cppcheck-cfg.rng

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -698,6 +698,7 @@
698698
<value>push</value>
699699
<value>pop</value>
700700
<value>find</value>
701+
<value>find-const</value>
701702
<value>insert</value>
702703
<value>erase</value>
703704
<value>change-content</value>

cfg/std.cfg

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8758,12 +8758,12 @@ initializer list (7) string& replace (const_iterator i1, const_iterator i2, init
87588758
<function name="back" yields="item"/>
87598759
<function name="data" yields="buffer"/>
87608760
<function name="c_str" yields="buffer-nt"/>
8761-
<function name="find" action="find"/>
8762-
<function name="rfind" action="find"/>
8763-
<function name="find_last_of" action="find"/>
8764-
<function name="find_last_not_of" action="find"/>
8765-
<function name="find_first_of" action="find"/>
8766-
<function name="find_first_not_of" action="find"/>
8761+
<function name="find" action="find-const"/>
8762+
<function name="rfind" action="find-const"/>
8763+
<function name="find_last_of" action="find-const"/>
8764+
<function name="find_last_not_of" action="find-const"/>
8765+
<function name="find_first_of" action="find-const"/>
8766+
<function name="find_first_not_of" action="find-const"/>
87678767
</access>
87688768
</container>
87698769
<container id="stdBasicString" startPattern="std :: basic_string &lt;" inherits="stdAllString">

lib/astutils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1966,15 +1966,15 @@ bool isConstFunctionCall(const Token* ftok, const Library& library)
19661966
return false;
19671967
if (container->getYield(ftok->str()) != Library::Container::Yield::NO_YIELD)
19681968
return true;
1969-
if (container->getAction(ftok->str()) == Library::Container::Action::FIND)
1969+
if (container->getAction(ftok->str()) == Library::Container::Action::FIND_CONST)
19701970
return true;
19711971
return false;
19721972
} else if (const Library::Function* lf = library.getFunction(ftok)) {
19731973
if (lf->ispure)
19741974
return true;
19751975
if (lf->containerYield != Library::Container::Yield::NO_YIELD)
19761976
return true;
1977-
if (lf->containerAction == Library::Container::Action::FIND)
1977+
if (lf->containerAction == Library::Container::Action::FIND_CONST)
19781978
return true;
19791979
return false;
19801980
} else {

lib/checkstl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1518,7 +1518,9 @@ void CheckStl::if_find()
15181518
}
15191519
}
15201520

1521-
if (container && container->getAction(funcTok->str()) == Library::Container::Action::FIND) {
1521+
Library::Container::Action action{};
1522+
if (container &&
1523+
((action = container->getAction(funcTok->str())) == Library::Container::Action::FIND || action == Library::Container::Action::FIND_CONST)) {
15221524
if (if_findCompare(funcTok->next(), container->stdStringLike))
15231525
continue;
15241526

lib/library.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,8 @@ Library::Container::Action Library::Container::actionFrom(const std::string& act
175175
return Container::Action::POP;
176176
if (actionName == "find")
177177
return Container::Action::FIND;
178+
if (actionName == "find-const")
179+
return Container::Action::FIND_CONST;
178180
if (actionName == "insert")
179181
return Container::Action::INSERT;
180182
if (actionName == "erase")

lib/library.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ class CPPCHECKLIB Library {
197197
PUSH,
198198
POP,
199199
FIND,
200+
FIND_CONST,
200201
INSERT,
201202
ERASE,
202203
CHANGE_CONTENT,

lib/valueflow.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8300,6 +8300,7 @@ bool ValueFlow::isContainerSizeChanged(const Token* tok, int indirect, const Set
83008300
}
83018301
break;
83028302
case Library::Container::Action::FIND:
8303+
case Library::Container::Action::FIND_CONST:
83038304
case Library::Container::Action::CHANGE_CONTENT:
83048305
case Library::Container::Action::CHANGE_INTERNAL:
83058306
break;

test/testlibrary.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -811,6 +811,7 @@ class TestLibrary : public TestFixture {
811811
" <function name=\"c_str\" yields=\"buffer-nt\"/>\n"
812812
" <function name=\"front\" yields=\"item\"/>\n"
813813
" <function name=\"find\" action=\"find\"/>\n"
814+
" <function name=\"cfind\" action=\"find-const\"/>\n"
814815
" </access>\n"
815816
" </container>\n"
816817
" <container id=\"B\" startPattern=\"std :: B &lt;\" inherits=\"A\" opLessAllowed=\"false\">\n"
@@ -851,6 +852,7 @@ class TestLibrary : public TestFixture {
851852
ASSERT_EQ(Library::Container::Action::PUSH, A.getAction("push_back"));
852853
ASSERT_EQ(Library::Container::Action::POP, A.getAction("pop_back"));
853854
ASSERT_EQ(Library::Container::Action::FIND, A.getAction("find"));
855+
ASSERT_EQ(Library::Container::Action::FIND_CONST, A.getAction("cfind"));
854856
ASSERT_EQ(Library::Container::Action::NO_ACTION, A.getAction("foo"));
855857

856858
ASSERT_EQUALS(B.type_templateArgNo, 1);

0 commit comments

Comments
 (0)