Added several C++11 algorithms and containers to CheckStl
Added pattern "> %varid%" to CheckStl::stlBoundries() Fixed message in checkOther (#1320)
This commit is contained in:
parent
82cd022646
commit
8e5949c6ce
|
@ -2470,7 +2470,7 @@ void CheckOther::checkMisusedScopedObject()
|
||||||
void CheckOther::misusedScopeObjectError(const Token *tok, const std::string& varname)
|
void CheckOther::misusedScopeObjectError(const Token *tok, const std::string& varname)
|
||||||
{
|
{
|
||||||
reportError(tok, Severity::error,
|
reportError(tok, Severity::error,
|
||||||
"unusedScopedObject", "instance of \"" + varname + "\" object destroyed immediately");
|
"unusedScopedObject", "Instance of \"" + varname + "\" object destroyed immediately.");
|
||||||
}
|
}
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
|
@ -190,10 +190,14 @@ void CheckStl::mismatchingContainersError(const Token *tok)
|
||||||
void CheckStl::mismatchingContainers()
|
void CheckStl::mismatchingContainers()
|
||||||
{
|
{
|
||||||
static const char* const algorithm2_strings[] = { // func(begin1, end1
|
static const char* const algorithm2_strings[] = { // func(begin1, end1
|
||||||
"adjacent_find", "binary_search", "count", "count_if", "equal", "equal_range", "find", "find_if", "for_each", "generate", "lower_bound", "make_heap",
|
"adjacent_find", "all_of", "any_of", "binary_search", "copy", "copy_if", "count", "count_if", "equal", "equal_range",
|
||||||
"max_element", "min_element", "mismatch", "next_permutation", "partition", "pop_heap", "prev_permutation", "push_heap", "random_shuffle", "remove",
|
"find", "find_if", "find_if_not", "for_each", "generate", "is_heap", "is_heap_until", "is_partitioned",
|
||||||
"remove_copy", "remove_copy_if", "remove_if", "replace", "replace_copy", "replace_copy_if", "replace_if", "reverse", "reverse_copy", "search_n",
|
"is_permutation", "is_sorted", "is_sorted_until", "lower_bound", "make_heap", "max_element", "minmax_element",
|
||||||
"sort", "sort_heap", "stable_partition", "stable_sort", "swap_ranges", "transform", "unique", "unique_copy", "upper_bound"
|
"min_element", "mismatch", "move", "move_backward", "next_permutation", "none_of", "partition", "partition_copy",
|
||||||
|
"partition_point", "pop_heap", "prev_permutation", "push_heap", "random_shuffle", "remove", "remove_copy",
|
||||||
|
"remove_copy_if", "remove_if", "replace", "replace_copy", "replace_copy_if", "replace_if", "reverse", "reverse_copy",
|
||||||
|
"search_n", "shuffle", "sort", "sort_heap", "stable_partition", "stable_sort", "swap_ranges", "transform", "unique",
|
||||||
|
"unique_copy", "upper_bound"
|
||||||
};
|
};
|
||||||
static const char* const algorithm22_strings[] = { // func(begin1, end1, begin2, end2
|
static const char* const algorithm22_strings[] = { // func(begin1, end1, begin2, end2
|
||||||
"find_end", "find_first_of", "includes", "lexicographical_compare", "merge", "partial_sort_copy",
|
"find_end", "find_first_of", "includes", "lexicographical_compare", "merge", "partial_sort_copy",
|
||||||
|
@ -664,7 +668,7 @@ void CheckStl::invalidPointerError(const Token *tok, const std::string &pointer_
|
||||||
void CheckStl::stlBoundries()
|
void CheckStl::stlBoundries()
|
||||||
{
|
{
|
||||||
// containers (not the vector)..
|
// containers (not the vector)..
|
||||||
static const char STL_CONTAINER_LIST[] = "bitset|deque|list|map|multimap|multiset|priority_queue|queue|set|stack|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset";
|
static const char STL_CONTAINER_LIST[] = "bitset|deque|list|forward_list|map|multimap|multiset|priority_queue|queue|set|stack|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset";
|
||||||
|
|
||||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
|
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
|
||||||
// Declaring iterator..
|
// Declaring iterator..
|
||||||
|
@ -691,6 +695,8 @@ void CheckStl::stlBoundries()
|
||||||
--indentlevel;
|
--indentlevel;
|
||||||
} else if (Token::Match(tok2, "!!* %varid% <", iteratorid)) {
|
} else if (Token::Match(tok2, "!!* %varid% <", iteratorid)) {
|
||||||
stlBoundriesError(tok2, container_name);
|
stlBoundriesError(tok2, container_name);
|
||||||
|
} else if (Token::Match(tok2, "> %varid%", iteratorid)) {
|
||||||
|
stlBoundriesError(tok2, container_name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -861,7 +867,7 @@ bool CheckStl::isStlContainer(unsigned int varid)
|
||||||
type = type->tokAt(2);
|
type = type->tokAt(2);
|
||||||
|
|
||||||
// all possible stl containers as a token
|
// all possible stl containers as a token
|
||||||
static const char STL_CONTAINER_LIST[] = "bitset|deque|list|map|multimap|multiset|priority_queue|queue|set|stack|vector|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset|basic_string";
|
static const char STL_CONTAINER_LIST[] = "array|bitset|deque|list|forward_list|map|multimap|multiset|priority_queue|queue|set|stack|vector|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset|basic_string";
|
||||||
|
|
||||||
// check if it's an stl template
|
// check if it's an stl template
|
||||||
if (Token::Match(type, STL_CONTAINER_LIST))
|
if (Token::Match(type, STL_CONTAINER_LIST))
|
||||||
|
@ -1216,7 +1222,7 @@ void CheckStl::checkAutoPointer()
|
||||||
return;
|
return;
|
||||||
|
|
||||||
std::set<unsigned int> autoPtrVarId;
|
std::set<unsigned int> autoPtrVarId;
|
||||||
static const char STL_CONTAINER_LIST[] = "bitset|deque|list|map|multimap|multiset|priority_queue|queue|set|stack|vector|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset|basic_string";
|
static const char STL_CONTAINER_LIST[] = "array|bitset|deque|list|forward_list|map|multimap|multiset|priority_queue|queue|set|stack|vector|hash_map|hash_multimap|hash_set|unordered_map|unordered_multimap|unordered_set|unordered_multiset|basic_string";
|
||||||
|
|
||||||
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
|
for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next()) {
|
||||||
if (Token::simpleMatch(tok, "auto_ptr <")) {
|
if (Token::simpleMatch(tok, "auto_ptr <")) {
|
||||||
|
|
|
@ -2385,7 +2385,7 @@ private:
|
||||||
CheckOther checkOther(&tokenizer, &settings, this);
|
CheckOther checkOther(&tokenizer, &settings, this);
|
||||||
checkOther.checkMisusedScopedObject();
|
checkOther.checkMisusedScopedObject();
|
||||||
|
|
||||||
ASSERT_EQUALS("[trac1132.cpp:16]: (error) instance of \"Lock\" object destroyed immediately\n", errout.str());
|
ASSERT_EQUALS("[trac1132.cpp:16]: (error) Instance of \"Lock\" object destroyed immediately.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void trac3693() {
|
void trac3693() {
|
||||||
|
@ -2433,7 +2433,7 @@ private:
|
||||||
" return 0 ;\n"
|
" return 0 ;\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) instance of \"NotAFunction\" object destroyed immediately\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Instance of \"NotAFunction\" object destroyed immediately.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMisusedScopeObjectPicksStruct() {
|
void testMisusedScopeObjectPicksStruct() {
|
||||||
|
@ -2444,7 +2444,7 @@ private:
|
||||||
" return true ;\n"
|
" return true ;\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) instance of \"NotAClass\" object destroyed immediately\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Instance of \"NotAClass\" object destroyed immediately.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMisusedScopeObjectDoesNotPickIf() {
|
void testMisusedScopeObjectDoesNotPickIf() {
|
||||||
|
@ -2501,7 +2501,7 @@ private:
|
||||||
" Foo();\n"
|
" Foo();\n"
|
||||||
"}\n"
|
"}\n"
|
||||||
);
|
);
|
||||||
ASSERT_EQUALS("[test.cpp:7]: (error) instance of \"Foo\" object destroyed immediately\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:7]: (error) Instance of \"Foo\" object destroyed immediately.\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void testMisusedScopeObjectDoesNotPickUsedObject() {
|
void testMisusedScopeObjectDoesNotPickUsedObject() {
|
||||||
|
@ -2529,7 +2529,7 @@ private:
|
||||||
"}\n";
|
"}\n";
|
||||||
|
|
||||||
check(code, "test.cpp");
|
check(code, "test.cpp");
|
||||||
ASSERT_EQUALS("[test.cpp:7]: (error) instance of \"cb_watch_bool\" object destroyed immediately\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:7]: (error) Instance of \"cb_watch_bool\" object destroyed immediately.\n", errout.str());
|
||||||
|
|
||||||
check(code, "test.c");
|
check(code, "test.c");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
|
@ -1105,6 +1105,12 @@ private:
|
||||||
|
|
||||||
ASSERT_EQUALS("[test.cpp:4]: (error) Dangerous container iterator compare using < operator for " + stlCont[i] + "\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:4]: (error) Dangerous container iterator compare using < operator for " + stlCont[i] + "\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" std::forward_list<int>::iterator it;\n"
|
||||||
|
" for (it = ab.begin(); ab.end() > it; ++it) {}\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:3]: (error) Dangerous container iterator compare using < operator for forward_list\n", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void stlBoundries2() {
|
void stlBoundries2() {
|
||||||
|
|
Loading…
Reference in New Issue