Skip to content

Commit 74a9515

Browse files
committed
fix #5591
1 parent 5ac33c8 commit 74a9515

File tree

2 files changed

+30
-0
lines changed

2 files changed

+30
-0
lines changed

lib/checkother.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4367,6 +4367,33 @@ void CheckOther::overlappingWriteFunction(const Token *tok, const std::string& f
43674367
reportError(tok, Severity::error, "overlappingWriteFunction", "Overlapping read/write in " + funcname + "() is undefined behavior");
43684368
}
43694369

4370+
void CheckOther::checkSuspiciousComma()
4371+
{
4372+
if (!mSettings->severity.isEnabled(Severity::style)) {
4373+
return;
4374+
}
4375+
4376+
logChecker("CheckOpComma::warnSuspiciousComma");
4377+
4378+
for (const Token* tok = mTokenizer->list.front(); tok; tok = tok->next()) {
4379+
if (tok->str() == "," && tok->isBinaryOp()) {
4380+
const Token * parent = tok->astParent();
4381+
if (parent && (Token::simpleMatch(parent->previous(), "if (") ||
4382+
Token::simpleMatch(parent->previous(), "while ("))) {
4383+
if (tok->previous()->str() == ")" && tok->previous()->link()->str() == "(") {
4384+
const Function * func = tok->previous()->link()->previous()->function();
4385+
if (func && func->initArgCount > 0) {
4386+
const Token * r_op = tok->astOperand2();
4387+
if (r_op && r_op->hasKnownValue()) {
4388+
reportError(tok, Severity::style, "warnSuspiciousComma", "There is an suspicious comma expression used as a condition.");
4389+
}
4390+
}
4391+
}
4392+
}
4393+
}
4394+
}
4395+
}
4396+
43704397
void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger)
43714398
{
43724399
CheckOther checkOther(&tokenizer, &tokenizer.getSettings(), errorLogger);
@@ -4414,6 +4441,7 @@ void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger)
44144441
checkOther.checkAccessOfMovedVariable();
44154442
checkOther.checkModuloOfOne();
44164443
checkOther.checkOverlappingWrite();
4444+
checkOther.checkSuspiciousComma();
44174445
}
44184446

44194447
void CheckOther::getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const

lib/checkother.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,8 @@ class CPPCHECKLIB CheckOther : public Check {
192192
void overlappingWriteUnion(const Token *tok);
193193
void overlappingWriteFunction(const Token *tok, const std::string& funcname);
194194

195+
void checkSuspiciousComma();
196+
195197
// Error messages..
196198
void checkComparisonFunctionIsAlwaysTrueOrFalseError(const Token* tok, const std::string &functionName, const std::string &varName, bool result);
197199
void checkCastIntToCharAndBackError(const Token *tok, const std::string &strFunctionName);

0 commit comments

Comments
 (0)