Skip to content

Commit 19df0b1

Browse files
authored
do not add empty filename to files in preprocess() (#350)
1 parent 25d95cc commit 19df0b1

File tree

2 files changed

+51
-8
lines changed

2 files changed

+51
-8
lines changed

simplecpp.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3274,6 +3274,9 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
32743274
sizeOfType.insert(std::make_pair("double *", sizeof(double *)));
32753275
sizeOfType.insert(std::make_pair("long double *", sizeof(long double *)));
32763276

3277+
// 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
3278+
std::vector<std::string> dummy;
3279+
32773280
const bool hasInclude = (dui.std.size() == 5 && dui.std.compare(0,3,"c++") == 0 && dui.std >= "c++17");
32783281
MacroMap macros;
32793282
for (std::list<std::string>::const_iterator it = dui.defines.begin(); it != dui.defines.end(); ++it) {
@@ -3285,26 +3288,26 @@ void simplecpp::preprocess(simplecpp::TokenList &output, const simplecpp::TokenL
32853288
continue;
32863289
const std::string lhs(macrostr.substr(0,eq));
32873290
const std::string rhs(eq==std::string::npos ? std::string("1") : macrostr.substr(eq+1));
3288-
const Macro macro(lhs, rhs, files);
3291+
const Macro macro(lhs, rhs, dummy);
32893292
macros.insert(std::pair<TokenString,Macro>(macro.name(), macro));
32903293
}
32913294

3292-
macros.insert(std::make_pair("__FILE__", Macro("__FILE__", "__FILE__", files)));
3293-
macros.insert(std::make_pair("__LINE__", Macro("__LINE__", "__LINE__", files)));
3294-
macros.insert(std::make_pair("__COUNTER__", Macro("__COUNTER__", "__COUNTER__", files)));
3295+
macros.insert(std::make_pair("__FILE__", Macro("__FILE__", "__FILE__", dummy)));
3296+
macros.insert(std::make_pair("__LINE__", Macro("__LINE__", "__LINE__", dummy)));
3297+
macros.insert(std::make_pair("__COUNTER__", Macro("__COUNTER__", "__COUNTER__", dummy)));
32953298
struct tm ltime = {};
32963299
getLocaltime(ltime);
3297-
macros.insert(std::make_pair("__DATE__", Macro("__DATE__", getDateDefine(&ltime), files)));
3298-
macros.insert(std::make_pair("__TIME__", Macro("__TIME__", getTimeDefine(&ltime), files)));
3300+
macros.insert(std::make_pair("__DATE__", Macro("__DATE__", getDateDefine(&ltime), dummy)));
3301+
macros.insert(std::make_pair("__TIME__", Macro("__TIME__", getTimeDefine(&ltime), dummy)));
32993302

33003303
if (!dui.std.empty()) {
33013304
std::string std_def = simplecpp::getCStdString(dui.std);
33023305
if (!std_def.empty()) {
3303-
macros.insert(std::make_pair("__STDC_VERSION__", Macro("__STDC_VERSION__", std_def, files)));
3306+
macros.insert(std::make_pair("__STDC_VERSION__", Macro("__STDC_VERSION__", std_def, dummy)));
33043307
} else {
33053308
std_def = simplecpp::getCppStdString(dui.std);
33063309
if (!std_def.empty())
3307-
macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, files)));
3310+
macros.insert(std::make_pair("__cplusplus", Macro("__cplusplus", std_def, dummy)));
33083311
}
33093312
}
33103313

test.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2714,6 +2714,44 @@ static void token()
27142714
ASSERT_TOKEN("+22", false, true, false);
27152715
}
27162716

2717+
static void preprocess_files()
2718+
{
2719+
{
2720+
const char code[] = "#define A";
2721+
std::vector<std::string> files;
2722+
2723+
const simplecpp::TokenList tokens = makeTokenList(code, files);
2724+
ASSERT_EQUALS(1, files.size());
2725+
ASSERT_EQUALS("", *files.cbegin());
2726+
2727+
simplecpp::TokenList tokens2(files);
2728+
ASSERT_EQUALS(1, files.size());
2729+
ASSERT_EQUALS("", *files.cbegin());
2730+
2731+
std::map<std::string, simplecpp::TokenList*> filedata;
2732+
simplecpp::preprocess(tokens2, tokens, files, filedata, simplecpp::DUI(), nullptr);
2733+
ASSERT_EQUALS(1, files.size());
2734+
ASSERT_EQUALS("", *files.cbegin());
2735+
}
2736+
{
2737+
const char code[] = "#define A";
2738+
std::vector<std::string> files;
2739+
2740+
const simplecpp::TokenList tokens = makeTokenList(code, files, "test.cpp");
2741+
ASSERT_EQUALS(1, files.size());
2742+
ASSERT_EQUALS("test.cpp", *files.cbegin());
2743+
2744+
simplecpp::TokenList tokens2(files);
2745+
ASSERT_EQUALS(1, files.size());
2746+
ASSERT_EQUALS("test.cpp", *files.cbegin());
2747+
2748+
std::map<std::string, simplecpp::TokenList*> filedata;
2749+
simplecpp::preprocess(tokens2, tokens, files, filedata, simplecpp::DUI(), nullptr);
2750+
ASSERT_EQUALS(1, files.size());
2751+
ASSERT_EQUALS("test.cpp", *files.cbegin());
2752+
}
2753+
}
2754+
27172755
static void fuzz_crash()
27182756
{
27192757
{
@@ -2949,6 +2987,8 @@ int main(int argc, char **argv)
29492987

29502988
TEST_CASE(token);
29512989

2990+
TEST_CASE(preprocess_files);
2991+
29522992
TEST_CASE(fuzz_crash);
29532993

29542994
return numberOfFailedAssertions > 0 ? EXIT_FAILURE : EXIT_SUCCESS;

0 commit comments

Comments
 (0)