From 00a855d64326c03f1e7b05ae335c774e910405d7 Mon Sep 17 00:00:00 2001 From: Edward Welbourne Date: Thu, 12 Nov 2015 11:01:31 +0100 Subject: [PATCH] Avoid having division caught up in parsing of comments. A loop to skip space and comments was meant to break on anything else but would have not broken on a division operator (where it should) due to it getting caught in the check for a comment-start, without falling back suitably when it didn't complete that check. Managed to contrive a suitably twisted change to findDeps test to reveal the bug; broken previously, now fixed. Not ideal, as it relied on another bug to fail previously - backslash-newline shouldn't end a preprocessing directive line - but it should still pass once that's fixed, too. Exercising a bug in qmake usually involves code that won't compile anyway, making it tricky to write a test that reveals the bug but that passes once it's fixed. Change-Id: I08a1d7cc5e3d7fd1ac0a48e5c09dfdfbb7580b11 Reviewed-by: Oswald Buddenhagen --- qmake/generators/makefiledeps.cpp | 27 +++++++++---------- .../qmake/testdata/findDeps/findDeps.pro | 2 +- .../tools/qmake/testdata/findDeps/main.cpp | 9 +++++-- .../tools/qmake/testdata/findDeps/needed.cpp | 1 + 4 files changed, 22 insertions(+), 17 deletions(-) create mode 100644 tests/auto/tools/qmake/testdata/findDeps/needed.cpp diff --git a/qmake/generators/makefiledeps.cpp b/qmake/generators/makefiledeps.cpp index 8c51a20aa6d..535f0561cc6 100644 --- a/qmake/generators/makefiledeps.cpp +++ b/qmake/generators/makefiledeps.cpp @@ -509,22 +509,21 @@ bool QMakeSourceFileInfo::findDeps(SourceFile *file) for(; x < buffer_len; ++x) { if (buffer[x] == ' ' || buffer[x] == '\t') { // keep going - } else if (buffer[x] == '/') { + } else if (buffer[x] == '/' && x + 1 < buffer_len && + (buffer[x + 1] == '/' || buffer[x + 1] == '*')) { ++x; - if(buffer_len >= x) { - if (buffer[x] == '/') { // C++-style comment - for (; x < buffer_len && !qmake_endOfLine(buffer[x]); ++x) {} // skip - beginning = 1; - } else if (buffer[x] == '*') { // C-style comment - for(++x; x < buffer_len; ++x) { - if (buffer[x] == '*') { - if (x + 1 < buffer_len && buffer[x + 1] == '/') { - ++x; - break; - } - } else if (qmake_endOfLine(buffer[x])) { - ++line_count; + if (buffer[x] == '/') { // C++-style comment + for (; x < buffer_len && !qmake_endOfLine(buffer[x]); ++x) {} // skip + beginning = 1; + } else { // C-style comment + while (++x < buffer_len) { + if (buffer[x] == '*') { + if (x + 1 < buffer_len && buffer[x + 1] == '/') { + ++x; // skip '*'; for loop skips '/'. + break; } + } else if (qmake_endOfLine(buffer[x])) { + ++line_count; } } } diff --git a/tests/auto/tools/qmake/testdata/findDeps/findDeps.pro b/tests/auto/tools/qmake/testdata/findDeps/findDeps.pro index 442c9c767fd..2713296f5b1 100644 --- a/tests/auto/tools/qmake/testdata/findDeps/findDeps.pro +++ b/tests/auto/tools/qmake/testdata/findDeps/findDeps.pro @@ -9,4 +9,4 @@ HEADERS += object1.h \ object7.h \ object8.h \ object9.h -SOURCES += main.cpp +SOURCES += main.cpp needed.cpp diff --git a/tests/auto/tools/qmake/testdata/findDeps/main.cpp b/tests/auto/tools/qmake/testdata/findDeps/main.cpp index e4aa5c6251f..0df3f9b7c3a 100644 --- a/tests/auto/tools/qmake/testdata/findDeps/main.cpp +++ b/tests/auto/tools/qmake/testdata/findDeps/main.cpp @@ -31,6 +31,9 @@ ** ****************************************************************************/ +#define spurious \ + / #include "needed.cpp" +// if not ignored, symbol needed() won't be available ... #include /**/ #include @@ -49,5 +52,7 @@ static void function2(); /**/ static void function3(); // #include -int main () {} - +int main () { + extern int needed(void); + return needed(); +} diff --git a/tests/auto/tools/qmake/testdata/findDeps/needed.cpp b/tests/auto/tools/qmake/testdata/findDeps/needed.cpp new file mode 100644 index 00000000000..698d0aaa12c --- /dev/null +++ b/tests/auto/tools/qmake/testdata/findDeps/needed.cpp @@ -0,0 +1 @@ +extern int needed(void) { return 1; }