diff --git a/lib/tokenize.cpp b/lib/tokenize.cpp index 0a4b63252..a0c401bef 100644 --- a/lib/tokenize.cpp +++ b/lib/tokenize.cpp @@ -2619,6 +2619,11 @@ bool Tokenizer::tokenize(std::istream &code, } } + // convert platform dependent types to standard types + // 32 bits: size_t -> unsigned long + // 64 bits: size_t -> unsigned long long + simplifyPlatformTypes(); + // collapse compound standard types into a single token // unsigned long long int => long _isUnsigned=true,_isLong=true simplifyStdType(); @@ -6572,6 +6577,69 @@ void Tokenizer::simplifyVarDecl() } } +void Tokenizer::simplifyPlatformTypes() +{ + enum { isLongLong, isLong, isInt } type; + + /** @todo This assumes a flat address space. Not true for segmented address space (FAR *). */ + if (_settings->sizeof_size_t == 8) + type = isLongLong; + else if (_settings->sizeof_size_t == 4 && _settings->sizeof_long == 4) + type = isLong; + else if (_settings->sizeof_size_t == 4) + type = isInt; + else + return; + + for (Token *tok = _tokens; tok; tok = tok->next()) + { + if (Token::simpleMatch(tok, "std :: size_t|ssize_t|ptrdiff_t|intptr_t|uintptr_t")) + { + tok->deleteNext(); + tok->deleteThis(); + } + else if (Token::simpleMatch(tok, ":: size_t|ssize_t|ptrdiff_t|intptr_t|uintptr_t")) + { + tok->deleteThis(); + } + + if (Token::Match(tok, "size_t|uintptr_t")) + { + tok->str("unsigned"); + + switch (type) + { + case isLongLong: + tok->insertToken("long"); + tok->insertToken("long"); + break; + case isLong : + tok->insertToken("long"); + break; + case isInt: + tok->insertToken("int"); + break; + } + } + else if (Token::Match(tok, "ssize_t|ptrdiff_t|intptr_t")) + { + switch (type) + { + case isLongLong: + tok->str("long"); + tok->insertToken("long"); + break; + case isLong : + tok->str("long"); + break; + case isInt: + tok->str("int"); + break; + } + } + } +} + void Tokenizer::simplifyStdType() { for (Token *tok = _tokens; tok; tok = tok->next()) diff --git a/lib/tokenize.h b/lib/tokenize.h index b0b417279..17ff051e7 100644 --- a/lib/tokenize.h +++ b/lib/tokenize.h @@ -221,6 +221,13 @@ public: void simplifyInitVar(); Token * initVar(Token * tok); + /** + * Convert platform dependent types to standard types. + * 32 bits: size_t -> unsigned long + * 64 bits: size_t -> unsigned long long + */ + void simplifyPlatformTypes(); + /** * Collapse compound standard types into a single token. * unsigned long long int => long _isUnsigned=true,_isLong=true diff --git a/test/testsimplifytokens.cpp b/test/testsimplifytokens.cpp index f923effc7..609764190 100644 --- a/test/testsimplifytokens.cpp +++ b/test/testsimplifytokens.cpp @@ -383,12 +383,13 @@ private: TEST_CASE(removeRedundantFor); } - std::string tok(const char code[], bool simplify = true) + std::string tok(const char code[], bool simplify = true, Settings::PlatformType type = Settings::Host) { errout.str(""); Settings settings; settings.addEnabled("portability"); + settings.platform(type); Tokenizer tokenizer(&settings, this); std::istringstream istr(code); @@ -1141,9 +1142,9 @@ private: // ticket #809 const char code[] = "int m ; " "compat_ulong_t um ; " - "size_t size ; size = sizeof ( m ) / sizeof ( um ) ;"; + "long size ; size = sizeof ( m ) / sizeof ( um ) ;"; - ASSERT_EQUALS(code, tok(code)); + ASSERT_EQUALS(code, tok(code, true, Settings::Win32)); } void sizeof11() @@ -2811,7 +2812,7 @@ private: { // Ticket #1997 const char code[] = "void * operator new[](size_t);"; - ASSERT_EQUALS("void * operatornew[] ( size_t ) ;", tok(code)); + ASSERT_EQUALS("void * operatornew[] ( long ) ;", tok(code, true, Settings::Win32)); } ASSERT_EQUALS("; a [ 0 ] ;", tok(";a[0*(*p)];")); diff --git a/test/testtokenize.cpp b/test/testtokenize.cpp index e266b613a..6f778925f 100644 --- a/test/testtokenize.cpp +++ b/test/testtokenize.cpp @@ -378,7 +378,7 @@ private: } - std::string tokenizeAndStringify(const char code[], bool simplify = false, Settings::PlatformType platform = Settings::Host) + std::string tokenizeAndStringify(const char code[], bool simplify = false, bool expand = true, Settings::PlatformType platform = Settings::Host) { errout.str(""); @@ -396,15 +396,17 @@ private: std::ostringstream ostr; for (const Token *tok = tokenizer.tokens(); tok; tok = tok->next()) { - if (!simplify) + if (expand) { if (tok->isUnsigned()) ostr << "unsigned "; else if (tok->isSigned()) ostr << "signed "; + + if (tok->isLong()) + ostr << "long "; } - if (tok->isLong()) - ostr << "long "; + ostr << tok->str(); // Append newlines @@ -711,7 +713,7 @@ private: { // ticket #970 const char code[] = "if (a >= (unsigned)(b)) {}"; - const char expected[] = "if ( a >= ( int ) b ) { }"; + const char expected[] = "if ( a >= ( unsigned int ) b ) { }"; ASSERT_EQUALS(expected, tokenizeAndStringify(code, true)); } @@ -4011,10 +4013,10 @@ private: const char code[] = "struct foo {\n" " void operator delete(void *obj, size_t sz);\n" "}\n"; - const std::string actual(tokenizeAndStringify(code)); + const std::string actual(tokenizeAndStringify(code, false, true, Settings::Win32)); const char expected[] = "struct foo {\n" - "void operatordelete ( void * obj , size_t sz ) ;\n" + "void operatordelete ( void * obj , unsigned long sz ) ;\n" "}"; ASSERT_EQUALS(expected, actual); @@ -5954,24 +5956,34 @@ private: "unsigned int sizeof_long_double = sizeof(long double);" "unsigned int sizeof_bool = sizeof(bool);" "unsigned int sizeof_pointer = sizeof(void *);" - "unsigned int sizeof_size_t = sizeof(size_t);"; + "unsigned int sizeof_size_t = sizeof(size_t);" + "size_t a;" + "ssize_t b;" + "ptrdiff_t c;" + "intptr_t d;" + "uintptr_t e;"; - const char expected[] = "int sizeof_short ; sizeof_short = 2 ; " - "int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " - "int sizeof_int ; sizeof_int = 4 ; " - "int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " - "int sizeof_long ; sizeof_long = 4 ; " - "int sizeof_unsigned_long ; sizeof_unsigned_long = 4 ; " - "int sizeof_long_long ; sizeof_long_long = 8 ; " - "int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " - "int sizeof_float ; sizeof_float = 4 ; " - "int sizeof_double ; sizeof_double = 8 ; " - "int sizeof_long_double ; sizeof_long_double = 8 ; " - "int sizeof_bool ; sizeof_bool = 1 ; " - "int sizeof_pointer ; sizeof_pointer = 4 ; " - "int sizeof_size_t ; sizeof_size_t = 4 ;"; + const char expected[] = "unsigned int sizeof_short ; sizeof_short = 2 ; " + "unsigned int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " + "unsigned int sizeof_int ; sizeof_int = 4 ; " + "unsigned int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " + "unsigned int sizeof_long ; sizeof_long = 4 ; " + "unsigned int sizeof_unsigned_long ; sizeof_unsigned_long = 4 ; " + "unsigned int sizeof_long_long ; sizeof_long_long = 8 ; " + "unsigned int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " + "unsigned int sizeof_float ; sizeof_float = 4 ; " + "unsigned int sizeof_double ; sizeof_double = 8 ; " + "unsigned int sizeof_long_double ; sizeof_long_double = 8 ; " + "unsigned int sizeof_bool ; sizeof_bool = 1 ; " + "unsigned int sizeof_pointer ; sizeof_pointer = 4 ; " + "unsigned int sizeof_size_t ; sizeof_size_t = 4 ; " + "unsigned long a ; " + "long b ; " + "long c ; " + "long d ; " + "unsigned long e ;"; - ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, Settings::Win32)); + ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, true, Settings::Win32)); } void platformWin64() @@ -5989,24 +6001,34 @@ private: "unsigned int sizeof_long_double = sizeof(long double);" "unsigned int sizeof_bool = sizeof(bool);" "unsigned int sizeof_pointer = sizeof(void *);" - "unsigned int sizeof_size_t = sizeof(size_t);"; + "unsigned int sizeof_size_t = sizeof(size_t);" + "size_t a;" + "ssize_t b;" + "ptrdiff_t c;" + "intptr_t d;" + "uintptr_t e;"; - const char expected[] = "int sizeof_short ; sizeof_short = 2 ; " - "int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " - "int sizeof_int ; sizeof_int = 4 ; " - "int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " - "int sizeof_long ; sizeof_long = 4 ; " - "int sizeof_unsigned_long ; sizeof_unsigned_long = 4 ; " - "int sizeof_long_long ; sizeof_long_long = 8 ; " - "int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " - "int sizeof_float ; sizeof_float = 4 ; " - "int sizeof_double ; sizeof_double = 8 ; " - "int sizeof_long_double ; sizeof_long_double = 8 ; " - "int sizeof_bool ; sizeof_bool = 1 ; " - "int sizeof_pointer ; sizeof_pointer = 8 ; " - "int sizeof_size_t ; sizeof_size_t = 8 ;"; + const char expected[] = "unsigned int sizeof_short ; sizeof_short = 2 ; " + "unsigned int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " + "unsigned int sizeof_int ; sizeof_int = 4 ; " + "unsigned int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " + "unsigned int sizeof_long ; sizeof_long = 4 ; " + "unsigned int sizeof_unsigned_long ; sizeof_unsigned_long = 4 ; " + "unsigned int sizeof_long_long ; sizeof_long_long = 8 ; " + "unsigned int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " + "unsigned int sizeof_float ; sizeof_float = 4 ; " + "unsigned int sizeof_double ; sizeof_double = 8 ; " + "unsigned int sizeof_long_double ; sizeof_long_double = 8 ; " + "unsigned int sizeof_bool ; sizeof_bool = 1 ; " + "unsigned int sizeof_pointer ; sizeof_pointer = 8 ; " + "unsigned int sizeof_size_t ; sizeof_size_t = 8 ; " + "unsigned long long a ; " + "long long b ; " + "long long c ; " + "long long d ; " + "unsigned long long e ;"; - ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, Settings::Win64)); + ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, true, Settings::Win64)); } void platformUnix32() @@ -6024,24 +6046,34 @@ private: "unsigned int sizeof_long_double = sizeof(long double);" "unsigned int sizeof_bool = sizeof(bool);" "unsigned int sizeof_pointer = sizeof(void *);" - "unsigned int sizeof_size_t = sizeof(size_t);"; + "unsigned int sizeof_size_t = sizeof(size_t);" + "size_t a;" + "ssize_t b;" + "ptrdiff_t c;" + "intptr_t d;" + "uintptr_t e;"; - const char expected[] = "int sizeof_short ; sizeof_short = 2 ; " - "int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " - "int sizeof_int ; sizeof_int = 4 ; " - "int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " - "int sizeof_long ; sizeof_long = 4 ; " - "int sizeof_unsigned_long ; sizeof_unsigned_long = 4 ; " - "int sizeof_long_long ; sizeof_long_long = 8 ; " - "int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " - "int sizeof_float ; sizeof_float = 4 ; " - "int sizeof_double ; sizeof_double = 8 ; " - "int sizeof_long_double ; sizeof_long_double = 12 ; " - "int sizeof_bool ; sizeof_bool = 1 ; " - "int sizeof_pointer ; sizeof_pointer = 4 ; " - "int sizeof_size_t ; sizeof_size_t = 4 ;"; + const char expected[] = "unsigned int sizeof_short ; sizeof_short = 2 ; " + "unsigned int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " + "unsigned int sizeof_int ; sizeof_int = 4 ; " + "unsigned int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " + "unsigned int sizeof_long ; sizeof_long = 4 ; " + "unsigned int sizeof_unsigned_long ; sizeof_unsigned_long = 4 ; " + "unsigned int sizeof_long_long ; sizeof_long_long = 8 ; " + "unsigned int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " + "unsigned int sizeof_float ; sizeof_float = 4 ; " + "unsigned int sizeof_double ; sizeof_double = 8 ; " + "unsigned int sizeof_long_double ; sizeof_long_double = 12 ; " + "unsigned int sizeof_bool ; sizeof_bool = 1 ; " + "unsigned int sizeof_pointer ; sizeof_pointer = 4 ; " + "unsigned int sizeof_size_t ; sizeof_size_t = 4 ; " + "unsigned long a ; " + "long b ; " + "long c ; " + "long d ; " + "unsigned long e ;"; - ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, Settings::Unix32)); + ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, true, Settings::Unix32)); } void platformUnix64() @@ -6059,24 +6091,34 @@ private: "unsigned int sizeof_long_double = sizeof(long double);" "unsigned int sizeof_bool = sizeof(bool);" "unsigned int sizeof_pointer = sizeof(void *);" - "unsigned int sizeof_size_t = sizeof(size_t);"; + "unsigned int sizeof_size_t = sizeof(size_t);" + "size_t a;" + "ssize_t b;" + "ptrdiff_t c;" + "intptr_t d;" + "uintptr_t e;"; - const char expected[] = "int sizeof_short ; sizeof_short = 2 ; " - "int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " - "int sizeof_int ; sizeof_int = 4 ; " - "int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " - "int sizeof_long ; sizeof_long = 8 ; " - "int sizeof_unsigned_long ; sizeof_unsigned_long = 8 ; " - "int sizeof_long_long ; sizeof_long_long = 8 ; " - "int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " - "int sizeof_float ; sizeof_float = 4 ; " - "int sizeof_double ; sizeof_double = 8 ; " - "int sizeof_long_double ; sizeof_long_double = 16 ; " - "int sizeof_bool ; sizeof_bool = 1 ; " - "int sizeof_pointer ; sizeof_pointer = 8 ; " - "int sizeof_size_t ; sizeof_size_t = 8 ;"; + const char expected[] = "unsigned int sizeof_short ; sizeof_short = 2 ; " + "unsigned int sizeof_unsigned_short ; sizeof_unsigned_short = 2 ; " + "unsigned int sizeof_int ; sizeof_int = 4 ; " + "unsigned int sizeof_unsigned_int ; sizeof_unsigned_int = 4 ; " + "unsigned int sizeof_long ; sizeof_long = 8 ; " + "unsigned int sizeof_unsigned_long ; sizeof_unsigned_long = 8 ; " + "unsigned int sizeof_long_long ; sizeof_long_long = 8 ; " + "unsigned int sizeof_unsigned_long_long ; sizeof_unsigned_long_long = 8 ; " + "unsigned int sizeof_float ; sizeof_float = 4 ; " + "unsigned int sizeof_double ; sizeof_double = 8 ; " + "unsigned int sizeof_long_double ; sizeof_long_double = 16 ; " + "unsigned int sizeof_bool ; sizeof_bool = 1 ; " + "unsigned int sizeof_pointer ; sizeof_pointer = 8 ; " + "unsigned int sizeof_size_t ; sizeof_size_t = 8 ; " + "unsigned long long a ; " + "long long b ; " + "long long c ; " + "long long d ; " + "unsigned long long e ;"; - ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, Settings::Unix64)); + ASSERT_EQUALS(expected, tokenizeAndStringify(code, true, true, Settings::Unix64)); } };