From b58cc3635287e7ea02f324932f6c9a9a0e88b880 Mon Sep 17 00:00:00 2001 From: firewave Date: Mon, 22 Apr 2024 18:39:37 +0200 Subject: [PATCH 1/2] do not add empty filename to `files` in `preprocess()` --- simplecpp.cpp | 19 +++++++++++-------- test.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 51 insertions(+), 8 deletions(-) diff --git a/simplecpp.cpp b/simplecpp.cpp index 1de36a52..812600bf 100755 --- a/simplecpp.cpp +++ b/simplecpp.cpp @@ -3274,6 +3274,9 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL sizeOfType.insert(std::make_pair("double *", sizeof(double *))); sizeOfType.insert(std::make_pair("long double *", sizeof(long double *))); + // use a dummy vector for the macros because as this is not part of the file and would add an empty entry - e.g. /usr/include/poll.h + std::vector dummy; + const bool hasInclude = (dui.std.size() == 5 && dui.std.compare(0,3,"c++") == 0 && dui.std >= "c++17"); MacroMap macros; for (std::list::const_iterator it = dui.defines.begin(); it != dui.defines.end(); ++it) { @@ -3285,26 +3288,26 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL continue; const std::string lhs(macrostr.substr(0,eq)); const std::string rhs(eq==std::string::npos ? std::string("1") : macrostr.substr(eq+1)); - const Macro macro(lhs, rhs, files); + const Macro macro(lhs, rhs, dummy); macros.insert(std::pair(macro.name(), macro)); } - macros.insert(std::make_pair("__FILE__", Macro("__FILE__", "__FILE__", files))); - macros.insert(std::make_pair("__LINE__", Macro("__LINE__", "__LINE__", files))); - macros.insert(std::make_pair("__COUNTER__", Macro("__COUNTER__", "__COUNTER__", files))); + macros.insert(std::make_pair("__FILE__", Macro("__FILE__", "__FILE__", dummy))); + macros.insert(std::make_pair("__LINE__", Macro("__LINE__", "__LINE__", dummy))); + macros.insert(std::make_pair("__COUNTER__", Macro("__COUNTER__", "__COUNTER__", dummy))); struct tm ltime = {}; getLocaltime(ltime); - macros.insert(std::make_pair("__DATE__", Macro("__DATE__", getDateDefine(<ime), files))); - macros.insert(std::make_pair("__TIME__", Macro("__TIME__", getTimeDefine(<ime), files))); + macros.insert(std::make_pair("__DATE__", Macro("__DATE__", getDateDefine(<ime), dummy))); + macros.insert(std::make_pair("__TIME__", Macro("__TIME__", getTimeDefine(<ime), dummy))); if (!dui.std.empty()) { std::string std_def = simplecpp::getCStdString(dui.std); if (!std_def.empty()) { - macros.insert(std::make_pair("__STDC_VERSION__", Macro("__STDC_VERSION__", std_def, files))); + macros.insert(std::make_pair("__STDC_VERSION__", Macro("__STDC_VERSION__", std_def, dummy))); } else { std_def = simplecpp::getCppStdString(dui.std); if (!std_def.empty()) - macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, files))); + macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, dummy))); } } diff --git a/test.cpp b/test.cpp index 322d1876..3411ca98 100644 --- a/test.cpp +++ b/test.cpp @@ -2714,6 +2714,44 @@ static void token() ASSERT_TOKEN("+22", false, true, false); } +static void preprocess_files() +{ + { + const char code[] = "#define A"; + std::vector files; + + simplecpp::TokenList tokens = makeTokenList(code, files); + ASSERT_EQUALS(1, files.size()); + ASSERT_EQUALS("", *files.cbegin()); + + simplecpp::TokenList tokens2(files); + ASSERT_EQUALS(1, files.size()); + ASSERT_EQUALS("", *files.cbegin()); + + std::map filedata; + simplecpp::preprocess(tokens2, tokens, files, filedata, simplecpp::DUI(), nullptr); + ASSERT_EQUALS(1, files.size()); + ASSERT_EQUALS("", *files.cbegin()); + } + { + const char code[] = "#define A"; + std::vector files; + + simplecpp::TokenList tokens = makeTokenList(code, files, "test.cpp"); + ASSERT_EQUALS(1, files.size()); + ASSERT_EQUALS("test.cpp", *files.cbegin()); + + simplecpp::TokenList tokens2(files); + ASSERT_EQUALS(1, files.size()); + ASSERT_EQUALS("test.cpp", *files.cbegin()); + + std::map filedata; + simplecpp::preprocess(tokens2, tokens, files, filedata, simplecpp::DUI(), nullptr); + ASSERT_EQUALS(1, files.size()); + ASSERT_EQUALS("test.cpp", *files.cbegin()); + } +} + static void fuzz_crash() { { @@ -2949,6 +2987,8 @@ int main(int argc, char **argv) TEST_CASE(token); + TEST_CASE(preprocess_files); + TEST_CASE(fuzz_crash); return numberOfFailedAssertions > 0 ? EXIT_FAILURE : EXIT_SUCCESS; From a19a790a81ad9d1129b29474959e5954b215b759 Mon Sep 17 00:00:00 2001 From: firewave Date: Tue, 23 Apr 2024 11:35:56 +0200 Subject: [PATCH 2/2] test.cpp: fixed `misc-const-correctness` clang-tidy warnings --- test.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test.cpp b/test.cpp index 3411ca98..16c5ce06 100644 --- a/test.cpp +++ b/test.cpp @@ -2720,7 +2720,7 @@ static void preprocess_files() const char code[] = "#define A"; std::vector files; - simplecpp::TokenList tokens = makeTokenList(code, files); + const simplecpp::TokenList tokens = makeTokenList(code, files); ASSERT_EQUALS(1, files.size()); ASSERT_EQUALS("", *files.cbegin()); @@ -2737,7 +2737,7 @@ static void preprocess_files() const char code[] = "#define A"; std::vector files; - simplecpp::TokenList tokens = makeTokenList(code, files, "test.cpp"); + const simplecpp::TokenList tokens = makeTokenList(code, files, "test.cpp"); ASSERT_EQUALS(1, files.size()); ASSERT_EQUALS("test.cpp", *files.cbegin());