Merge pull request #2697 from pfultz2/unique_lock
Extend mutex checking for more locking patterns
This commit is contained in:
commit
1ad70bbeb8
|
@ -2439,7 +2439,7 @@ void CheckStl::checkMutexes()
|
||||||
continue;
|
continue;
|
||||||
if (isLocalMutex(var, tok->scope()))
|
if (isLocalMutex(var, tok->scope()))
|
||||||
localMutexError(tok);
|
localMutexError(tok);
|
||||||
} else if (Token::Match(tok, "%var% (|{ %var% )|}")) {
|
} else if (Token::Match(tok, "%var% (|{ %var% )|}|,")) {
|
||||||
if (!isLockGuard(var))
|
if (!isLockGuard(var))
|
||||||
continue;
|
continue;
|
||||||
const Variable* mvar = tok->tokAt(2)->variable();
|
const Variable* mvar = tok->tokAt(2)->variable();
|
||||||
|
|
|
@ -4429,6 +4429,22 @@ private:
|
||||||
true);
|
true);
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" static std::mutex m;\n"
|
||||||
|
" static std::unique_lock<std::mutex> g(m, std::defer_lock);\n"
|
||||||
|
" static std::lock(g);\n"
|
||||||
|
"}\n",
|
||||||
|
true);
|
||||||
|
ASSERT_EQUALS("[test.cpp:3]: (warning) Lock guard is defined globally. Lock guards are intended to be local. A global lock guard could lead to a deadlock since it won't unlock until the end of the program.\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" static std::mutex m;\n"
|
||||||
|
" std::unique_lock<std::mutex> g(m, std::defer_lock);\n"
|
||||||
|
" std::lock(g);\n"
|
||||||
|
"}\n",
|
||||||
|
true);
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
check("void f() {\n"
|
check("void f() {\n"
|
||||||
" std::mutex m;\n"
|
" std::mutex m;\n"
|
||||||
" std::lock_guard<std::mutex> g(m);\n"
|
" std::lock_guard<std::mutex> g(m);\n"
|
||||||
|
@ -4436,6 +4452,21 @@ private:
|
||||||
true);
|
true);
|
||||||
ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str());
|
ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" std::mutex m;\n"
|
||||||
|
" std::unique_lock<std::mutex> g(m);\n"
|
||||||
|
"}\n",
|
||||||
|
true);
|
||||||
|
ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" std::mutex m;\n"
|
||||||
|
" std::unique_lock<std::mutex> g(m, std::defer_lock);\n"
|
||||||
|
" std::lock(g);\n"
|
||||||
|
"}\n",
|
||||||
|
true);
|
||||||
|
ASSERT_EQUALS("[test.cpp:3]: (warning) The lock is ineffective because the mutex is locked at the same scope as the mutex itself.\n", errout.str());
|
||||||
|
|
||||||
check("void g();\n"
|
check("void g();\n"
|
||||||
"void f() {\n"
|
"void f() {\n"
|
||||||
" static std::mutex m;\n"
|
" static std::mutex m;\n"
|
||||||
|
|
Loading…
Reference in New Issue