@@ -4367,6 +4367,34 @@ 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 () && tok->previous ()->str () == " )" && tok->previous ()->link () && tok->previous ()->link ()->str () == " (" ) {
4384+ const Token * t = tok->previous ()->link ()->previous ();
4385+ const Function * func = t->function ();
4386+ if (func && func->initArgCount > 0 ) {
4387+ const Token * r_op = tok->astOperand2 ();
4388+ if (r_op && r_op->hasKnownValue ()) {
4389+ reportError (tok, Severity::style, " warnSuspiciousComma" , " There is an suspicious comma expression used as a condition." );
4390+ }
4391+ }
4392+ }
4393+ }
4394+ }
4395+ }
4396+ }
4397+
43704398void CheckOther::runChecks (const Tokenizer &tokenizer, ErrorLogger *errorLogger)
43714399{
43724400 CheckOther checkOther (&tokenizer, &tokenizer.getSettings (), errorLogger);
@@ -4414,6 +4442,7 @@ void CheckOther::runChecks(const Tokenizer &tokenizer, ErrorLogger *errorLogger)
44144442 checkOther.checkAccessOfMovedVariable ();
44154443 checkOther.checkModuloOfOne ();
44164444 checkOther.checkOverlappingWrite ();
4445+ checkOther.checkSuspiciousComma ();
44174446}
44184447
44194448void CheckOther::getErrorMessages (ErrorLogger *errorLogger, const Settings *settings) const
0 commit comments