Skip to content

Commit 48a958f

Browse files
authored
Fix #403 (Stack overflow in Macro::expand()) (#411)
1 parent cc5738c commit 48a958f

File tree

2 files changed

+13
-1
lines changed

2 files changed

+13
-1
lines changed

simplecpp.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -2169,7 +2169,8 @@ namespace simplecpp {
21692169
for (const Token *partok = parametertokens[argnr]->next; partok != parametertokens[argnr + 1U];) {
21702170
const MacroMap::const_iterator it = macros.find(partok->str());
21712171
if (it != macros.end() && !partok->isExpandedFrom(&it->second) && (partok->str() == name() || expandedmacros.find(partok->str()) == expandedmacros.end())) {
2172-
const std::set<TokenString> expandedmacros2; // temporary amnesia to allow reexpansion of currently expanding macros during argument evaluation
2172+
std::set<TokenString> expandedmacros2(expandedmacros); // temporary amnesia to allow reexpansion of currently expanding macros during argument evaluation
2173+
expandedmacros2.erase(name());
21732174
partok = it->second.expand(output, loc, partok, macros, expandedmacros2);
21742175
} else {
21752176
output->push_back(newMacroToken(partok->str(), loc, isReplaced(expandedmacros), partok));

test.cpp

+11
Original file line numberDiff line numberDiff line change
@@ -859,6 +859,16 @@ static void define_define_22() // #400 inner macro not expanded after hash hash
859859
ASSERT_EQUALS("\n\n\n34", preprocess(code));
860860
}
861861

862+
static void define_define_23() // #403 crash (infinite recursion)
863+
{
864+
const char code[] = "#define C_(x, y) x ## y\n"
865+
"#define C(x, y) C_(x, y)\n"
866+
"#define X(func) C(Y, C(func, Z))\n"
867+
"#define die X(die)\n"
868+
"die(void);\n";
869+
ASSERT_EQUALS("\n\n\n\nYdieZ ( void ) ;", preprocess(code));
870+
}
871+
862872
static void define_va_args_1()
863873
{
864874
const char code[] = "#define A(fmt...) dostuff(fmt)\n"
@@ -3055,6 +3065,7 @@ int main(int argc, char **argv)
30553065
TEST_CASE(define_define_20); // 384 arg contains comma
30563066
TEST_CASE(define_define_21);
30573067
TEST_CASE(define_define_22); // #400
3068+
TEST_CASE(define_define_23); // #403 - crash, infinite recursion
30583069
TEST_CASE(define_va_args_1);
30593070
TEST_CASE(define_va_args_2);
30603071
TEST_CASE(define_va_args_3);

0 commit comments

Comments
 (0)