@@ -649,7 +649,7 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
649649 ValueFlow::Value value (0 );
650650 value.setKnown ();
651651 setTokenValue (const_cast <Token *>(tok), value, settings);
652- } else if (Token::simpleMatch (tok, " sizeof (" ) && tok-> tokAt ( 2 ) ) {
652+ } else if (Token::simpleMatch (tok, " sizeof (" )) {
653653 const Token *tok2 = tok->tokAt (2 );
654654 if (tok2->enumerator () && tok2->enumerator ()->scope ) {
655655 long long size = settings->sizeof_int ;
@@ -681,6 +681,56 @@ static Token * valueFlowSetConstantValue(const Token *tok, const Settings *setti
681681 value.setKnown ();
682682 setTokenValue (const_cast <Token *>(tok), value, settings);
683683 setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
684+ } else if (Token::Match (tok, " sizeof ( %var% ) / sizeof (" ) && tok->next ()->astParent () == tok->tokAt (4 )) {
685+ // Get number of elements in array
686+ const Token *sz1 = tok->tokAt (2 );
687+ const Token *sz2 = tok->tokAt (7 );
688+ const unsigned int varid1 = sz1->varId ();
689+ if (varid1 &&
690+ sz1->variable () &&
691+ sz1->variable ()->isArray () &&
692+ !sz1->variable ()->dimensions ().empty () &&
693+ sz1->variable ()->dimensionKnown (0 ) &&
694+ (Token::Match (sz2, " * %varid% )" , varid1) || Token::Match (sz2, " %varid% [ 0 ] )" , varid1))) {
695+ ValueFlow::Value value (sz1->variable ()->dimension (0 ));
696+ value.setKnown ();
697+ setTokenValue (const_cast <Token *>(tok->tokAt (4 )), value, settings);
698+ }
699+ } else if (!tok2->type ()) {
700+ const ValueType &vt = ValueType::parseDecl (tok2,settings);
701+ if (vt.pointer ) {
702+ ValueFlow::Value value (settings->sizeof_pointer );
703+ value.setKnown ();
704+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
705+ } else if (vt.type == ValueType::Type::CHAR) {
706+ ValueFlow::Value value (1 );
707+ value.setKnown ();
708+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
709+ } else if (vt.type == ValueType::Type::SHORT) {
710+ ValueFlow::Value value (settings->sizeof_short );
711+ value.setKnown ();
712+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
713+ } else if (vt.type == ValueType::Type::INT) {
714+ ValueFlow::Value value (settings->sizeof_int );
715+ value.setKnown ();
716+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
717+ } else if (vt.type == ValueType::Type::LONG) {
718+ ValueFlow::Value value (settings->sizeof_long );
719+ value.setKnown ();
720+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
721+ } else if (vt.type == ValueType::Type::LONGLONG) {
722+ ValueFlow::Value value (settings->sizeof_long_long );
723+ value.setKnown ();
724+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
725+ } else if (vt.type == ValueType::Type::FLOAT) {
726+ ValueFlow::Value value (settings->sizeof_float );
727+ value.setKnown ();
728+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
729+ } else if (vt.type == ValueType::Type::DOUBLE) {
730+ ValueFlow::Value value (settings->sizeof_double );
731+ value.setKnown ();
732+ setTokenValue (const_cast <Token *>(tok->next ()), value, settings);
733+ }
684734 }
685735 // skip over enum
686736 tok = tok->linkAt (1 );
0 commit comments