summaryrefslogtreecommitdiffstats
path: root/tests/libfuzzer
diff options
context:
space:
mode:
authorEdward Welbourne <edward.welbourne@qt.io>2018-11-15 16:38:12 +0100
committerAndreas Buhr <andreas.buhr@qt.io>2020-11-19 12:28:45 +0100
commit28e4a8421ca618097bf8de35dab17ffbd423e468 (patch)
tree859c73fc8fa982491f73ac3fddf8889f20ff2835 /tests/libfuzzer
parent5126e461a22cd076cb3d0516500a4f3a06b50dac (diff)
Fuzzing: Add a test for QDateTime::fromString
This patch adds a basic fuzzing test for QDateTime::fromString. Task-number: QTBUG-87104 Pick-to: 5.15 Change-Id: Icc51386f06f6d4d2a4495734f7fa45de80c6e065 Reviewed-by: Robert Loehning <robert.loehning@qt.io>
Diffstat (limited to 'tests/libfuzzer')
-rw-r--r--tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro10
-rw-r--r--tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp100
2 files changed, 110 insertions, 0 deletions
diff --git a/tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro b/tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro
new file mode 100644
index 0000000000..631fcd71e4
--- /dev/null
+++ b/tests/libfuzzer/corelib/time/qdatetime/fromstring/fromstring.pro
@@ -0,0 +1,10 @@
+QT -= gui
+CONFIG -= app_bundle
+CONFIG += console
+SOURCES += main.cpp
+FUZZ_ENGINE = $$(LIB_FUZZING_ENGINE)
+isEmpty(FUZZ_ENGINE) {
+ QMAKE_LFLAGS += -fsanitize=fuzzer
+} else {
+ LIBS += $$FUZZ_ENGINE
+}
diff --git a/tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp b/tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp
new file mode 100644
index 0000000000..e41301bb55
--- /dev/null
+++ b/tests/libfuzzer/corelib/time/qdatetime/fromstring/main.cpp
@@ -0,0 +1,100 @@
+/****************************************************************************
+**
+** Copyright (C) 2020 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the test suite of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include <QDateTime>
+
+static const QString formats[] = {
+ QStringLiteral("h"),
+ QStringLiteral("hh"),
+ QStringLiteral("H"),
+ QStringLiteral("HH"),
+ QStringLiteral("m"),
+ QStringLiteral("mm"),
+ QStringLiteral("s"),
+ QStringLiteral("ss"),
+ QStringLiteral("z"),
+ QStringLiteral("zzz"),
+ QStringLiteral("A"),
+ QStringLiteral("t"),
+ QStringLiteral("M/d/yyyy"),
+ QStringLiteral("M/d/yyyy hh:mm"),
+ QStringLiteral("M/d/yyyy hh:mm A"),
+ QStringLiteral("M/d/yyyy, hh:mm"),
+ QStringLiteral("M/d/yyyy, hh:mm A"),
+ QStringLiteral("MMM d yyyy"),
+ QStringLiteral("MMM d yyyy hh:mm"),
+ QStringLiteral("MMM d yyyy hh:mm:ss"),
+ QStringLiteral("MMM d yyyy, hh:mm"),
+ QStringLiteral("MMM d yyyy, hh:mm:ss"),
+ QStringLiteral("MMMM d yyyy"),
+ QStringLiteral("MMMM d yyyy hh:mm"),
+ QStringLiteral("MMMM d yyyy hh:mm:ss"),
+ QStringLiteral("MMMM d yyyy, hh:mm"),
+ QStringLiteral("MMMM d yyyy, hh:mm:ss"),
+ QStringLiteral("MMMM d yyyy, hh:mm:ss t"),
+ QStringLiteral("MMM d, yyyy"),
+ QStringLiteral("MMM d, yyyy hh:mm"),
+ QStringLiteral("MMM d, yyyy hh:mm:ss"),
+ QStringLiteral("MMMM d, yyyy"),
+ QStringLiteral("MMMM d, yyyy hh:mm"),
+ QStringLiteral("MMMM d, yyyy hh:mm:ss"),
+ QStringLiteral("MMMM d, yyyy hh:mm:ss t"),
+ QStringLiteral("d MMM yyyy"),
+ QStringLiteral("d MMM yyyy hh:mm"),
+ QStringLiteral("d MMM yyyy hh:mm:ss"),
+ QStringLiteral("d MMM yyyy, hh:mm"),
+ QStringLiteral("d MMM yyyy, hh:mm:ss"),
+ QStringLiteral("d MMMM yyyy"),
+ QStringLiteral("d MMMM yyyy hh:mm"),
+ QStringLiteral("d MMMM yyyy hh:mm:ss"),
+ QStringLiteral("d MMMM yyyy, hh:mm"),
+ QStringLiteral("d MMMM yyyy, hh:mm:ss"),
+ QStringLiteral("d MMM, yyyy"),
+ QStringLiteral("d MMM, yyyy hh:mm"),
+ QStringLiteral("d MMM, yyyy hh:mm:ss"),
+ QStringLiteral("d MMMM, yyyy"),
+ QStringLiteral("d MMMM, yyyy hh:mm"),
+ QStringLiteral("d MMMM, yyyy hh:mm:ss"),
+ QStringLiteral("yyyy-MM-ddThh:mm:ss.zt"),
+};
+
+// libFuzzer entry-point for testing QDateTimeParser
+extern "C" int LLVMFuzzerTestOneInput(const char *Data, size_t Size)
+{
+ const QString userString = QString::fromUtf8(Data, Size);
+
+ QDateTime::fromString(userString, Qt::TextDate);
+ QDateTime::fromString(userString, Qt::ISODate);
+ QDateTime::fromString(userString, Qt::RFC2822Date);
+ QDateTime::fromString(userString, Qt::ISODateWithMs);
+
+ for (const auto &format : formats) {
+ QDateTime::fromString(userString, format);
+ }
+ return 0;
+}