#8050 cppcheckError: 0xFFFFFFul -> 16777215ULU. Don't add a suffix 'U' if there is already a suffix present.

This commit is contained in:
amai2012 2017-05-05 14:47:58 +02:00
parent a8a54bbfa8
commit 3e11eb9dca
4 changed files with 29 additions and 6 deletions

View File

@ -846,6 +846,11 @@ bool MathLib::isFloatHex(const std::string& str)
return state==EXPONENT_DIGITS;
}
bool MathLib::isValidIntegerSuffix(const std::string& str)
{
return isValidIntegerSuffix(str.begin(), str.end());
}
bool MathLib::isValidIntegerSuffix(std::string::const_iterator it, std::string::const_iterator end)
{
enum {START, SUFFIX_U, SUFFIX_UL, SUFFIX_ULL, SUFFIX_L, SUFFIX_LU, SUFFIX_LL, SUFFIX_LLU, SUFFIX_I, SUFFIX_I6, SUFFIX_I64, SUFFIX_UI, SUFFIX_UI6, SUFFIX_UI64} state = START;
@ -1020,7 +1025,7 @@ bool MathLib::isInt(const std::string & str)
return isDec(str) || isIntHex(str) || isOct(str) || isBin(str);
}
static std::string getsuffix(const std::string& value)
std::string MathLib::getSuffix(const std::string& value)
{
if (value.size() > 3 && value[value.size() - 3] == 'i' && value[value.size() - 2] == '6' && value[value.size() - 1] == '4') {
if (value[value.size() - 4] == 'u')
@ -1048,8 +1053,8 @@ static std::string getsuffix(const std::string& value)
static std::string intsuffix(const std::string & first, const std::string & second)
{
std::string suffix1 = getsuffix(first);
std::string suffix2 = getsuffix(second);
const std::string suffix1 = MathLib::getSuffix(first);
const std::string suffix2 = MathLib::getSuffix(second);
if (suffix1 == "ULL" || suffix2 == "ULL")
return "ULL";
if (suffix1 == "LL" || suffix2 == "LL")

View File

@ -89,6 +89,8 @@ public:
static bool isOct(const std::string& str);
static bool isBin(const std::string& str);
static std::string getSuffix(const std::string& value);
static bool isValidIntegerSuffix(const std::string& str);
static bool isValidIntegerSuffix(std::string::const_iterator it, std::string::const_iterator end);
static std::string add(const std::string & first, const std::string & second);

View File

@ -129,12 +129,15 @@ void TokenList::addtoken(std::string str, const unsigned int lineno, const unsig
}
// Replace hexadecimal value with decimal
if (MathLib::isIntHex(str) || MathLib::isOct(str) || MathLib::isBin(str)) {
const bool isHex = MathLib::isIntHex(str) ;
if (isHex || MathLib::isOct(str) || MathLib::isBin(str)) {
// TODO: It would be better if TokenList didn't simplify hexadecimal numbers
std::string suffix;
if (str.compare(0,2,"0x") == 0 &&
if (isHex &&
str.size() == (2 + _settings->int_bit / 4) &&
(str[2] >= '8')) // includes A-F and a-f
(str[2] >= '8') && // includes A-F and a-f
MathLib::getSuffix(str).empty()
)
suffix = "U";
str = MathLib::value(str).str() + suffix;
}

View File

@ -51,6 +51,7 @@ private:
TEST_CASE(tokenize11);
TEST_CASE(tokenize13); // bailout if the code contains "@" - that is not handled well.
TEST_CASE(tokenize14); // tokenize "0X10" => 16
TEST_CASE(tokenizeHexWithSuffix); // tokenize 0xFFFFFFul
TEST_CASE(tokenize15); // tokenize ".123"
TEST_CASE(tokenize17); // #2759
TEST_CASE(tokenize18); // tokenize "(X&&Y)" into "( X && Y )" instead of "( X & & Y )"
@ -679,6 +680,18 @@ private:
ASSERT_EQUALS("; 292 ;", tokenizeAndStringify(";0444;"));
}
// Ticket #8050
void tokenizeHexWithSuffix() {
ASSERT_EQUALS("; 16777215 ;", tokenizeAndStringify(";0xFFFFFF;"));
ASSERT_EQUALS("; 16777215U ;", tokenizeAndStringify(";0xFFFFFFu;"));
ASSERT_EQUALS("; 16777215UL ;", tokenizeAndStringify(";0xFFFFFFul;"));
// Number of digits decides about internal representation...
ASSERT_EQUALS("; 4294967295U ;", tokenizeAndStringify(";0xFFFFFFFF;"));
ASSERT_EQUALS("; 4294967295U ;", tokenizeAndStringify(";0xFFFFFFFFu;"));
ASSERT_EQUALS("; 4294967295UL ;", tokenizeAndStringify(";0xFFFFFFFFul;"));
}
// Ticket #2429: 0.125
void tokenize15() {
ASSERT_EQUALS("0.125 ;", tokenizeAndStringify(".125;"));