diff --git a/lib/preprocessor.cpp b/lib/preprocessor.cpp index b10ff859ad6..5212b76c830 100644 --- a/lib/preprocessor.cpp +++ b/lib/preprocessor.cpp @@ -1072,11 +1072,19 @@ void Preprocessor::simplifyPragmaAsmPrivate(simplecpp::TokenList &tokenList) break; } - const simplecpp::Token * const tok4 = tok3->next; tok->setstr("asm"); const_cast(tok2)->setstr("("); const_cast(tok3)->setstr(")"); - const_cast(tok4)->setstr(";"); + + simplecpp::Token * tok4; + if (tok3->next) { + tok4 = tok3->next; + tok4->setstr(";"); + } else { + tok4 = new simplecpp::Token(";", tok3->location); + const_cast(tok3)->next = tok4; + } + while (tok4->next != endasm) tokenList.deleteToken(tok4->next); } diff --git a/test/cli/fuzz-crash/crash-ef635709a2489083534cd422e6a089daab23ec64 b/test/cli/fuzz-crash/crash-ef635709a2489083534cd422e6a089daab23ec64 new file mode 100644 index 00000000000..6274e3a27a1 --- /dev/null +++ b/test/cli/fuzz-crash/crash-ef635709a2489083534cd422e6a089daab23ec64 @@ -0,0 +1 @@ +#pragma asm \ No newline at end of file diff --git a/test/testpreprocessor.cpp b/test/testpreprocessor.cpp index 781f6b6cf35..7b044e5343b 100644 --- a/test/testpreprocessor.cpp +++ b/test/testpreprocessor.cpp @@ -362,6 +362,8 @@ class TestPreprocessor : public TestFixture { TEST_CASE(standard); TEST_CASE(writeLocations); + + TEST_CASE(pragmaAsm); } template @@ -2773,6 +2775,12 @@ class TestPreprocessor : public TestFixture { "} ;", processed); } + + void pragmaAsm() + { + const char code[] = "#pragma asm"; + (void) getcodeforcfg(settingsDefault, *this, code, "", "test.cpp"); + } }; REGISTER_TEST(TestPreprocessor)