Skip to content

Commit

Permalink
Fix #403 (Stack overflow in Macro::expand()) (#411)
Browse files Browse the repository at this point in the history
  • Loading branch information
danmar authored Feb 12, 2025
1 parent cc5738c commit 48a958f
Show file tree
Hide file tree
Showing 2 changed files with 13 additions and 1 deletion.
3 changes: 2 additions & 1 deletion simplecpp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2169,7 +2169,8 @@ namespace simplecpp {
for (const Token *partok = parametertokens[argnr]->next; partok != parametertokens[argnr + 1U];) {
const MacroMap::const_iterator it = macros.find(partok->str());
if (it != macros.end() && !partok->isExpandedFrom(&it->second) && (partok->str() == name() || expandedmacros.find(partok->str()) == expandedmacros.end())) {
const std::set<TokenString> expandedmacros2; // temporary amnesia to allow reexpansion of currently expanding macros during argument evaluation
std::set<TokenString> expandedmacros2(expandedmacros); // temporary amnesia to allow reexpansion of currently expanding macros during argument evaluation
expandedmacros2.erase(name());
partok = it->second.expand(output, loc, partok, macros, expandedmacros2);
} else {
output->push_back(newMacroToken(partok->str(), loc, isReplaced(expandedmacros), partok));
Expand Down
11 changes: 11 additions & 0 deletions test.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -859,6 +859,16 @@ static void define_define_22() // #400 inner macro not expanded after hash hash
ASSERT_EQUALS("\n\n\n34", preprocess(code));
}

static void define_define_23() // #403 crash (infinite recursion)
{
const char code[] = "#define C_(x, y) x ## y\n"
"#define C(x, y) C_(x, y)\n"
"#define X(func) C(Y, C(func, Z))\n"
"#define die X(die)\n"
"die(void);\n";
ASSERT_EQUALS("\n\n\n\nYdieZ ( void ) ;", preprocess(code));
}

static void define_va_args_1()
{
const char code[] = "#define A(fmt...) dostuff(fmt)\n"
Expand Down Expand Up @@ -3055,6 +3065,7 @@ int main(int argc, char **argv)
TEST_CASE(define_define_20); // 384 arg contains comma
TEST_CASE(define_define_21);
TEST_CASE(define_define_22); // #400
TEST_CASE(define_define_23); // #403 - crash, infinite recursion
TEST_CASE(define_va_args_1);
TEST_CASE(define_va_args_2);
TEST_CASE(define_va_args_3);
Expand Down

0 comments on commit 48a958f

Please sign in to comment.