Skip to content

Commit 9be4ffb

Browse files
committed
Add Valuetype type and sign for stdint macros
1 parent c0b4c73 commit 9be4ffb

3 files changed

Lines changed: 68 additions & 1 deletion

File tree

addons/test/misra/misra-test.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -725,7 +725,7 @@ static void misra_10_3(uint32_t u32a, uint32_t u32b) {
725725
res = 0.1f; // 10.3
726726
const char c = '0'; // no-warning
727727
bool b = true; // no-warning
728-
uint32_t u = UINT32_C(10); // 17.3 no-warning
728+
uint32_t u = UINT32_C(10); // no-warning
729729
}
730730

731731
static void misra_10_4(u32 x, s32 y) {

lib/symboldatabase.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7531,6 +7531,38 @@ static const Function* getFunction(const Token* tok) {
75317531
return nullptr;
75327532
}
75337533

7534+
static int getIntegerConstantMacroWidth(const std::string &name) {
7535+
if (name.back() != 'C')
7536+
return 0;
7537+
size_t pos = (name[0] == 'U') ? 1 : 0;
7538+
if (name[pos] != 'I' || name[pos + 1] != 'N' || name[pos + 2] != 'T')
7539+
return 0;
7540+
pos += 3;
7541+
int intnum = 0;
7542+
if (name[pos] == '8') {
7543+
++pos;
7544+
intnum = 8;
7545+
}
7546+
else if (name[pos] == '1' && name[pos + 1] == '6') {
7547+
pos += 2;
7548+
intnum = 16;
7549+
}
7550+
else if (name[pos] == '3' && name[pos + 1] == '2') {
7551+
pos += 2;
7552+
intnum = 32;
7553+
}
7554+
else if (name[pos] == '6' && name[pos + 1] == '4') {
7555+
pos += 2;
7556+
intnum = 64;
7557+
}
7558+
else
7559+
return 0;
7560+
if (pos + 2 != name.size() || name[pos] != '_')
7561+
return 0;
7562+
7563+
return intnum;
7564+
}
7565+
75347566
void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *tokens)
75357567
{
75367568
if (!tokens)
@@ -7672,6 +7704,29 @@ void SymbolDatabase::setValueTypeInTokenList(bool reportDebugWarnings, Token *to
76727704
}
76737705
}
76747706

7707+
// functions from stdint.h
7708+
else if (const int macroWidth = getIntegerConstantMacroWidth(tok->previous()->str())) {
7709+
ValueType valuetype;
7710+
if (macroWidth == mSettings.platform.char_bit)
7711+
valuetype.type = ValueType::Type::CHAR;
7712+
else if (macroWidth == mSettings.platform.short_bit)
7713+
valuetype.type = ValueType::Type::SHORT;
7714+
else if (macroWidth == mSettings.platform.int_bit)
7715+
valuetype.type = ValueType::Type::INT;
7716+
else if (macroWidth == mSettings.platform.long_bit)
7717+
valuetype.type = ValueType::Type::LONG;
7718+
else if (macroWidth == mSettings.platform.long_long_bit)
7719+
valuetype.type = ValueType::Type::LONGLONG;
7720+
else
7721+
valuetype.type = ValueType::Type::INT;
7722+
7723+
if (tok->previous()->str()[0] == 'U')
7724+
valuetype.sign = ValueType::Sign::UNSIGNED;
7725+
else
7726+
valuetype.sign = ValueType::Sign::SIGNED;
7727+
setValueType(tok, valuetype);
7728+
}
7729+
76757730
// function style cast
76767731
else if (tok->previous() && tok->previous()->isStandardType()) {
76777732
ValueType valuetype;

test/testsymboldatabase.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -622,6 +622,8 @@ class TestSymbolDatabase : public TestFixture {
622622
TEST_CASE(dumpFriend); // Check if isFriend added to dump file
623623

624624
TEST_CASE(smartPointerLookupCtor); // #13719);
625+
626+
TEST_CASE(stdintFunction);
625627
}
626628

627629
void array() {
@@ -11317,6 +11319,16 @@ class TestSymbolDatabase : public TestFixture {
1131711319

1131811320
ASSERT(db);
1131911321
}
11322+
11323+
void stdintFunction() {
11324+
GET_SYMBOL_DB("static void example1(void){\n"
11325+
" uint32_t val = 1000;\n"
11326+
" uint8_t a = (uint8_t)(val / UINT32_C(60));\n"
11327+
"}\n");
11328+
const Token* tok = Token::findsimplematch(tokenizer.tokens(), "UINT32_C (");
11329+
ASSERT_EQUALS(tok->next()->valueType()->sign, ValueType::Sign::UNSIGNED);
11330+
ASSERT_EQUALS(tok->next()->valueType()->type, ValueType::Type::INT);
11331+
}
1132011332
};
1132111333

1132211334
REGISTER_TEST(TestSymbolDatabase)

0 commit comments

Comments
 (0)