From 6d04f3ce25fd17b0fe3b8ac154928d3970469993 Mon Sep 17 00:00:00 2001 From: hjk Date: Tue, 29 May 2012 14:33:56 +0200 Subject: [PATCH] preprocessor: do not loop endlessly on incomplete expressions An missing closing parantheses after "defined(..." caused an endless loop. Change-Id: I19b17cebc1a56880216c3bfb67c9d296f80cc064 Reviewed-by: Leandro Melo --- src/libs/cplusplus/pp-engine.cpp | 12 +++++------ .../preprocessor/tst_preprocessor.cpp | 20 +++++++++++++++++++ 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/src/libs/cplusplus/pp-engine.cpp b/src/libs/cplusplus/pp-engine.cpp index 83a104ba102..1748a322e68 100644 --- a/src/libs/cplusplus/pp-engine.cpp +++ b/src/libs/cplusplus/pp-engine.cpp @@ -654,12 +654,12 @@ void Preprocessor::handleDefined(PPToken *tk) break; } while (isValidToken(*tk)); - if (lparenSeen) { - while (tk->isNot(T_RPAREN)) - lex(tk); - } else { - pushToken(tk); - } + + if (lparenSeen && tk->is(T_RPAREN)) + lex(tk); + + pushToken(tk); + QByteArray result(1, '0'); if (m_env->resolve(idToken.asByteArrayRef())) result[0] = '1'; diff --git a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp index bc669ab9b5f..e1ddc900be7 100644 --- a/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp +++ b/tests/auto/cplusplus/preprocessor/tst_preprocessor.cpp @@ -886,6 +886,26 @@ void tst_Preprocessor::defined_data() "#if X <= 0x040000\n" "#define Y 1\n" "#endif\n"; + + QTest::newRow("incomplete defined 1") << true << true << + "#define X 0x040500\n" + "#if defined(X\n" + "#define Y 1\n" + "#endif\n"; + QTest::newRow("incomplete defined 2") << false << false << + "#if defined(X\n" + "#define Y 1\n" + "#endif\n"; + QTest::newRow("complete defined 1") << true << true << + "#define X 0x040500\n" + "#if defined(X )\n" + "#define Y 1\n" + "#endif\n"; + QTest::newRow("complete defined 2") << true << true << + "#define X 0x040500\n" + "#if defined(X/*xxx*/)\n" + "#define Y 1\n" + "#endif\n"; } QTEST_APPLESS_MAIN(tst_Preprocessor)