diff --git a/lib/cppcheck.cpp b/lib/cppcheck.cpp index dc4488a0c..1676b2936 100644 --- a/lib/cppcheck.cpp +++ b/lib/cppcheck.cpp @@ -115,6 +115,8 @@ unsigned int CppCheck::processFile(const std::string& filename, std::istream& fi // Get directives preprocessor.setDirectives(tokens1); + preprocessor.setPlatformInfo(&tokens1); + // Get configurations.. if (_settings.userDefines.empty() || _settings.force) { Timer t("Preprocessor::getConfigs", _settings.showtime, &S_timerResults); diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index 33951e595..38a9c1f15 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -440,6 +440,26 @@ void Preprocessor::removeComments() } } +void Preprocessor::setPlatformInfo(simplecpp::TokenList *tokens) const +{ + tokens->sizeOfType["bool"] = _settings.sizeof_bool; + tokens->sizeOfType["short"] = _settings.sizeof_short; + tokens->sizeOfType["int"] = _settings.sizeof_int; + tokens->sizeOfType["long"] = _settings.sizeof_long; + tokens->sizeOfType["long long"] = _settings.sizeof_long_long; + tokens->sizeOfType["float"] = _settings.sizeof_float; + tokens->sizeOfType["double"] = _settings.sizeof_double; + tokens->sizeOfType["long double"] = _settings.sizeof_long_double; + tokens->sizeOfType["bool *"] = _settings.sizeof_pointer; + tokens->sizeOfType["short *"] = _settings.sizeof_pointer; + tokens->sizeOfType["int *"] = _settings.sizeof_pointer; + tokens->sizeOfType["long *"] = _settings.sizeof_pointer; + tokens->sizeOfType["long long *"] = _settings.sizeof_pointer; + tokens->sizeOfType["float *"] = _settings.sizeof_pointer; + tokens->sizeOfType["double *"] = _settings.sizeof_pointer; + tokens->sizeOfType["long double *"] = _settings.sizeof_pointer; +} + std::string Preprocessor::getcode(const simplecpp::TokenList &tokens1, const std::string &cfg, std::vector &files, const bool writeLocations) { const std::string filename(files[0]); diff --git a/lib/preprocessor.h b/lib/preprocessor.h index f217ba0d4..826994ba5 100644 --- a/lib/preprocessor.h +++ b/lib/preprocessor.h @@ -96,6 +96,7 @@ public: void removeComments(); + void setPlatformInfo(simplecpp::TokenList *tokens) const; /** * Extract the code for each configuration diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 26ef9ca68..0995841ab 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -103,6 +103,8 @@ private: TEST_CASE(error4); // #2919 - wrong filename is reported TEST_CASE(error5); + TEST_CASE(setPlatformInfo); + // Handling include guards (don't create extra configuration for it) TEST_CASE(includeguard1); TEST_CASE(includeguard2); @@ -633,6 +635,31 @@ private: ASSERT_EQUALS("", errout.str()); } + void setPlatformInfo() { + Settings settings; + Preprocessor preprocessor(settings, this); + + // read code with simplecpp.. + const char filedata[] = "#if sizeof(long) == 4\n" + "1\n" + "#else\n" + "2\n" + "#endif\n"; + std::istringstream istr(filedata); + std::vector files; + simplecpp::TokenList tokens(istr, files, "test.c"); + + // preprocess code with unix32 platform.. + settings.platform(Settings::PlatformType::Unix32); + preprocessor.setPlatformInfo(&tokens); + ASSERT_EQUALS("\n1", preprocessor.getcode(tokens, "", files, false)); + + // preprocess code with unix64 platform.. + settings.platform(Settings::PlatformType::Unix64); + preprocessor.setPlatformInfo(&tokens); + ASSERT_EQUALS("\n\n\n2", preprocessor.getcode(tokens, "", files, false)); + } + void includeguard1() { // Handling include guards.. const char filedata[] = "#file \"abc.h\"\n"