@@ -10007,6 +10007,14 @@ void Tokenizer::simplifyBitfields()
10007
10007
}
10008
10008
}
10009
10009
10010
+ const auto tooLargeError = [this ](const Token *tok) {
10011
+ const MathLib::bigint max = std::numeric_limits<short >::max ();
10012
+ reportError (tok,
10013
+ Severity::warning,
10014
+ " tooLargeBitField" ,
10015
+ " Bit-field size exceeds max number of bits " + std::to_string (max));
10016
+ };
10017
+
10010
10018
Token* typeTok = tok->next ();
10011
10019
while (Token::Match (typeTok, " const|volatile" ))
10012
10020
typeTok = typeTok->next ();
@@ -10015,7 +10023,8 @@ void Tokenizer::simplifyBitfields()
10015
10023
!Token::simpleMatch (tok->tokAt (2 ), " default :" )) {
10016
10024
Token *tok1 = typeTok->next ();
10017
10025
if (Token::Match (tok1, " %name% : %num% [;=]" ))
10018
- tok1->setBits (MathLib::toBigNumber (tok1->tokAt (2 )));
10026
+ if (!tok1->setBits (MathLib::toBigNumber (tok1->tokAt (2 ))))
10027
+ tooLargeError (tok1->tokAt (2 ));
10019
10028
if (tok1 && tok1->tokAt (2 ) &&
10020
10029
(Token::Match (tok1->tokAt (2 ), " %bool%|%num%" ) ||
10021
10030
!Token::Match (tok1->tokAt (2 ), " public|protected|private| %type% ::|<|,|{|;" ))) {
@@ -10040,10 +10049,13 @@ void Tokenizer::simplifyBitfields()
10040
10049
const std::string name = " anonymous@" + std::to_string (id);
10041
10050
Token *newTok = typeTok->insertToken (name);
10042
10051
newTok->isAnonymous (true );
10052
+ bool failed;
10043
10053
if (newTok->tokAt (2 )->isBoolean ())
10044
- newTok->setBits (newTok->strAt (2 ) == " true" );
10054
+ failed = ! newTok->setBits (newTok->strAt (2 ) == " true" );
10045
10055
else
10046
- newTok->setBits (MathLib::toBigNumber (newTok->tokAt (2 )));
10056
+ failed = !newTok->setBits (MathLib::toBigNumber (newTok->tokAt (2 )));
10057
+ if (failed)
10058
+ tooLargeError (newTok->tokAt (2 ));
10047
10059
newTok->deleteNext (2 );
10048
10060
}
10049
10061
0 commit comments