QRegExp: fix crash
authorGiuseppe D'Angelo <dangelog@gmail.com>
Sun, 26 Feb 2012 01:45:53 +0000 (01:45 +0000)
committerQt by Nokia <qt-info@nokia.com>
Mon, 27 Feb 2012 12:54:24 +0000 (13:54 +0100)
Fixes a crash when invoking various QRegExp methods on an object
*before* doing any match. For instance fixes:
  QRegExp re;
  re.matchedLength(); // crash

Task-number: QTBUG-23352
Change-Id: I9c239ff790a139c7820ef1aeced89d31320ae6b0
Reviewed-by: Andy Shaw <andy.shaw@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
src/corelib/tools/qregexp.cpp
tests/auto/corelib/tools/qregexp/tst_qregexp.cpp

index e8c0d4e..d7bcd0e 100644 (file)
@@ -3934,6 +3934,7 @@ static void invalidateEngine(QRegExpPrivate *priv)
 QRegExp::QRegExp()
 {
     priv = new QRegExpPrivate;
+    prepareEngine(priv);
 }
 
 /*!
@@ -3949,6 +3950,7 @@ QRegExp::QRegExp()
 QRegExp::QRegExp(const QString &pattern, Qt::CaseSensitivity cs, PatternSyntax syntax)
 {
     priv = new QRegExpPrivate(QRegExpEngineKey(pattern, syntax, cs));
+    prepareEngine(priv);
 }
 
 /*!
index 0148e93..a697e23 100644 (file)
@@ -79,6 +79,8 @@ private slots:
     void posAndCapConsistency_data();
     void posAndCapConsistency();
     void interval();
+    void validityCheck_data();
+    void validityCheck();
 };
 
 // Testing get/set functions
@@ -1344,6 +1346,33 @@ void tst_QRegExp::interval()
     }
 }
 
+void tst_QRegExp::validityCheck_data()
+{
+    QTest::addColumn<QString>("pattern");
+    QTest::addColumn<bool>("validity");
+    QTest::newRow("validity01") << QString() << true;
+    QTest::newRow("validity02") << QString("abc.*abc") << true;
+    QTest::newRow("validity03") << QString("[a-z") << false;
+    QTest::newRow("validity04") << QString("a(b") << false;
+}
+
+void tst_QRegExp::validityCheck()
+{
+    QFETCH(QString, pattern);
+
+    QRegExp rx(pattern);
+    QTEST(rx.isValid(), "validity");
+    QCOMPARE(rx.matchedLength(), -1);
+    QCOMPARE(rx.pos(), -1);
+    QCOMPARE(rx.cap(), QString(""));
+
+    QRegExp rx2(rx);
+    QTEST(rx2.isValid(), "validity");
+    QCOMPARE(rx2.matchedLength(), -1);
+    QCOMPARE(rx2.pos(), -1);
+    QCOMPARE(rx2.cap(), QString(""));
+}
+
 
 QTEST_APPLESS_MAIN(tst_QRegExp)
 #include "tst_qregexp.moc"