Skip to content

Commit 6590d46

Browse files
committed
Added missing functionality to <container> elements in Librarie, completed STL container definitions in std.cfg
1 parent 4abc0b7 commit 6590d46

4 files changed

Lines changed: 79 additions & 12 deletions

File tree

cfg/std.cfg

Lines changed: 60 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3966,6 +3966,11 @@
39663966
<function name="clear" action="clear"/>
39673967
<function name="size" yields="size"/>
39683968
<function name="empty" yields="empty"/>
3969+
<function name="erase" action="erase"/>
3970+
<function name="insert" action="insert"/>
3971+
<function name="emplace" action="push"/>
3972+
<function name="swap" action="change"/>
3973+
<function name="assign" action="change"/>
39693974
</size>
39703975
<access>
39713976
<function name="begin" yields="start-iterator"/>
@@ -3981,66 +3986,110 @@
39813986
<container id="stdVectorDeque" startPattern="std :: vector|deque &lt;" inherits="stdContainer" opLessAllowed="true">
39823987
<size>
39833988
<function name="push_back" action="push"/>
3989+
<function name="emplace_back" action="push"/>
39843990
<function name="pop_back" action="pop"/>
39853991
<function name="push_front" action="push"/>
3992+
<function name="emplace_front" action="push"/>
39863993
<function name="pop_front" action="pop"/>
39873994
</size>
39883995
<access indexOperator="array-like">
39893996
<function name="at" yields="at_index"/>
39903997
<function name="front" yields="item"/>
39913998
<function name="back" yields="item"/>
39923999
<function name="data" yields="buffer"/>
4000+
<function name="shrink_to_fit" action="change-internal"/>
4001+
<function name="reserve" action="change-internal"/>
39934002
</access>
39944003
</container>
39954004
<container id="stdArray" startPattern="std :: array &lt;" inherits="stdContainer" opLessAllowed="true">
3996-
<size templateParameter="1"/>
4005+
<size templateParameter="1">
4006+
<function name="max_size" yields="size"/>
4007+
</size>
39974008
<access indexOperator="array-like">
39984009
<function name="at" yields="at_index"/>
39994010
<function name="front" yields="item"/>
40004011
<function name="back" yields="item"/>
40014012
<function name="data" yields="buffer"/>
4013+
<function name="fill" action="change-content"/>
40024014
</access>
40034015
</container>
40044016
<container id="stdBitset" startPattern="std :: bitset &lt;" inherits="stdContainer" itEndPattern="">
40054017
<size templateParameter="0"/>
40064018
<access indexOperator="array-like" />
40074019
</container>
40084020
<container id="stdQueue" startPattern="std :: queue|priority_queue &lt;" inherits="stdContainer">
4021+
<access>
4022+
<function name="push" action="push"/>
4023+
<function name="pop" action="pop"/>
4024+
<function name="front" yields="item"/>
4025+
<function name="back" yields="item"/>
4026+
</access>
40094027
</container>
40104028
<container id="stdStack" startPattern="std :: stack &lt;" inherits="stdContainer">
4029+
<access>
4030+
<function name="push" action="push"/>
4031+
<function name="pop" action="pop"/>
4032+
<function name="top" yields="item"/>
4033+
</access>
40114034
</container>
40124035
<container id="stdSet" startPattern="std :: set|unoredered_set|multiset|unoredered_multiset &lt;" inherits="stdContainer">
40134036
<access>
4014-
<function name="find" action="find"/>
4037+
<function name="find" action="find" yields="iterator"/>
4038+
<function name="count" action="find"/>
4039+
<function name="emplace_hint" action="push"/>
4040+
<function name="rehash" action="change-internal"/>
4041+
<function name="lower_bound" yields="iterator"/>
4042+
<function name="upper_bound" yields="iterator"/>
40154043
</access>
40164044
</container>
40174045
<container id="stdMap" startPattern="std :: map|unordered_map|multimap|unordered_multimap &lt;" inherits="stdContainer">
40184046
<type templateParameter="1"/>
40194047
<access>
40204048
<function name="at" yields="at_index"/>
4021-
<function name="find" action="find"/>
4049+
<function name="count" action="find"/>
4050+
<function name="find" action="find" yields="iterator"/>
4051+
<function name="emplace_hint" action="push"/>
4052+
<function name="rehash" action="change-internal"/>
4053+
<function name="lower_bound" yields="iterator"/>
4054+
<function name="upper_bound" yields="iterator"/>
40224055
</access>
40234056
</container>
40244057
<container id="stdList" startPattern="std :: list|forward_list &lt;" inherits="stdContainer">
40254058
<size>
40264059
<function name="push_back" action="push"/>
4060+
<function name="emplace_back" action="push"/>
4061+
<function name="emplace_after" action="push"/>
40274062
<function name="pop_back" action="pop"/>
40284063
<function name="push_front" action="push"/>
4064+
<function name="emplace_front" action="push"/>
40294065
<function name="pop_front" action="pop"/>
4066+
<function name="erase_after" action="erase"/>
4067+
<function name="insert_after" action="insert"/>
4068+
<function name="remove" action="change"/>
4069+
<function name="remove_if" action="change"/>
4070+
<function name="unique" action="change"/>
4071+
<function name="merge" action="change"/>
4072+
<function name="splice" action="change"/>
4073+
<function name="splice_after" action="change"/>
40304074
</size>
40314075
<access>
40324076
<function name="front" yields="item"/>
40334077
<function name="back" yields="item"/>
4078+
<function name="before_begin" yields="iterator"/>
4079+
<function name="cbefore_begin" yields="iterator"/>
4080+
<function name="reverse" action="change-content"/>
4081+
<function name="sort" action="change-content"/>
40344082
</access>
40354083
</container>
4036-
<container id="stdComplex" startPattern="std :: complex &lt;" endPattern="&gt; !!::">
4037-
<type templateParameter="1"/>
4038-
</container>
40394084
<container id="stdAllString" inherits="stdContainer" opLessAllowed="true">
40404085
<type string="std-like"/>
40414086
<size>
40424087
<function name="push_back" action="push"/>
40434088
<function name="pop_back" action="pop"/>
4089+
<function name="append" action="change"/>
4090+
<function name="replace" action="change"/>
4091+
<function name="reserve" action="change-internal"/>
4092+
<function name="shrink_to_fit" action="change-internal"/>
40444093
</size>
40454094
<access indexOperator="array-like">
40464095
<function name="at" yields="at_index"/>
@@ -4050,6 +4099,11 @@
40504099
<function name="c_str" yields="buffer-nt"/>
40514100
<function name="length" yields="size"/>
40524101
<function name="find" action="find"/>
4102+
<function name="rfind" action="find"/>
4103+
<function name="find_last_of" action="find"/>
4104+
<function name="find_last_not_of" action="find"/>
4105+
<function name="find_first_of" action="find"/>
4106+
<function name="find_first_not_of" action="find"/>
40534107
</access>
40544108
</container>
40554109
<container id="stdBasicString" startPattern="std :: basic_string &lt;" inherits="stdAllString">

lib/checkstl.cpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ void CheckStl::iterators()
8686
continue;
8787

8888
Library::Container::Yield yield = container->getYield(containertok->strAt(2));
89-
if (yield != Library::Container::END_ITERATOR && yield != Library::Container::START_ITERATOR)
89+
if (yield != Library::Container::END_ITERATOR && yield != Library::Container::START_ITERATOR && yield != Library::Container::ITERATOR)
9090
continue;
9191
} else
9292
continue;
@@ -693,7 +693,7 @@ void CheckStl::if_find()
693693
if (if_findCompare(funcTok->next()))
694694
continue;
695695

696-
if (printWarning && !container->stdStringLike)
696+
if (printWarning && container->getYield(funcTok->str()) == Library::Container::ITERATOR)
697697
if_findError(tok, false);
698698
else if (printPerformance && container->stdStringLike)
699699
if_findError(tok, true);
@@ -1405,13 +1405,14 @@ void CheckStl::readingEmptyStlContainer_parseUsage(const Token* tok, const Libra
14051405
const Token* parent = tok->tokAt(3)->astParent();
14061406
// Member function call
14071407
if (yield != Library::Container::NO_YIELD &&
1408-
((yield != Library::Container::START_ITERATOR &&
1408+
((yield != Library::Container::ITERATOR &&
1409+
yield != Library::Container::START_ITERATOR &&
14091410
yield != Library::Container::END_ITERATOR) || !parent || Token::Match(parent, "%cop%|=|*"))) { // These functions read from the container
14101411
if (!noerror)
14111412
readingEmptyStlContainerError(tok);
14121413
} else {
14131414
Library::Container::Action action = container->getAction(tok->strAt(2));
1414-
if (action == Library::Container::FIND) {
1415+
if (action == Library::Container::FIND || action == Library::Container::ERASE || action == Library::Container::POP || action == Library::Container::CLEAR) {
14151416
if (!noerror)
14161417
readingEmptyStlContainerError(tok);
14171418
} else

lib/library.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,16 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
356356
action = Container::POP;
357357
else if (actionName == "find")
358358
action = Container::FIND;
359+
else if (actionName == "insert")
360+
action = Container::INSERT;
361+
else if (actionName == "erase")
362+
action = Container::ERASE;
363+
else if (actionName == "change-content")
364+
action = Container::CHANGE_CONTENT;
365+
else if (actionName == "change-internal")
366+
action = Container::CHANGE_INTERNAL;
367+
else if (actionName == "change")
368+
action = Container::CHANGE;
359369
else
360370
return Error(BAD_ATTRIBUTE_VALUE, actionName);
361371
}
@@ -376,6 +386,8 @@ Library::Error Library::load(const tinyxml2::XMLDocument &doc)
376386
yield = Container::START_ITERATOR;
377387
else if (yieldName == "end-iterator")
378388
yield = Container::END_ITERATOR;
389+
else if (yieldName == "iterator")
390+
yield = Container::ITERATOR;
379391
else if (yieldName == "size")
380392
yield = Container::SIZE;
381393
else if (yieldName == "empty")

lib/library.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,11 +142,11 @@ class CPPCHECKLIB Library {
142142
}
143143

144144
enum Action {
145-
RESIZE, CLEAR, PUSH, POP, FIND,
145+
RESIZE, CLEAR, PUSH, POP, FIND, INSERT, ERASE, CHANGE_CONTENT, CHANGE, CHANGE_INTERNAL,
146146
NO_ACTION
147147
};
148148
enum Yield {
149-
AT_INDEX, ITEM, BUFFER, BUFFER_NT, START_ITERATOR, END_ITERATOR, SIZE, EMPTY,
149+
AT_INDEX, ITEM, BUFFER, BUFFER_NT, START_ITERATOR, END_ITERATOR, ITERATOR, SIZE, EMPTY,
150150
NO_YIELD
151151
};
152152
struct Function {

0 commit comments

Comments
 (0)