blob: 01df66355fb3dfddfd72a5ffd5737c1e898d9fcf [file] [log] [blame]
Change 409297624 by jvoisin@jvoisin:CS-wordlist2hunspell-2021-11-11_155813:9670:citc on 2021/11/11 19:00:20
Import hunspell's fuzzer from OSS-Fuzz
PRESUBMIT=passed
BUG=202533043
R=jiho
APPROVED=jiho
REQUIRED_REVIEW=1
DELTA=99 (99 added, 0 deleted, 0 changed)
DELTA_BY_EXTENSION=cxx=81
OCL=409141596
Affected files ...
... //depot//BUILD#25 edit
... //depot//src/tools/fuzzer.cxx#1 add
==== //depot//src/tools/fuzzer.cxx - /google/src/files/409297624/depot//src/tools/fuzzer.cxx ====
--- /dev/null 2024-07-09 14:08:07.516000169 -0400
+++ /google/src/files/409297624/depot//src/tools/fuzzer.cxx 2021-11-11 22:00:20.000000000 -0500
@@ -0,0 +1,81 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/* ***** BEGIN LICENSE BLOCK *****
+ * Version: MPL 1.1/GPL 2.0/LGPL 2.1
+ *
+ * The contents of this file are subject to the Mozilla Public License Version
+ * 1.1 (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/
+ *
+ * Software distributed under the License is distributed on an "AS IS" basis,
+ * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
+ * for the specific language governing rights and limitations under the
+ * License.
+ *
+ * Alternatively, the contents of this file may be used under the terms of
+ * either the GNU General Public License Version 2 or later (the "GPL"), or
+ * the GNU Lesser General Public License Version 2.1 or later (the "LGPL"),
+ * in which case the provisions of the GPL or the LGPL are applicable instead
+ * of those above. If you wish to allow use of your version of this file only
+ * under the terms of either the GPL or the LGPL, and not to allow others to
+ * use your version of this file under the terms of the MPL, indicate your
+ * decision by deleting the provisions above and replace them with the notice
+ * and other provisions required by the GPL or the LGPL. If you do not delete
+ * the provisions above, a recipient may use your version of this file under
+ * the terms of any one of the MPL, the GPL or the LGPL.
+ *
+ * ***** END LICENSE BLOCK ***** */
+
+#include <../hunspell/hunspell.hxx>
+#include <sys/types.h>
+#include <dirent.h>
+#include <string.h>
+#include <libgen.h>
+#include <memory>
+#include <vector>
+#include <string>
+
+std::vector<std::unique_ptr<Hunspell>> dictionaries;
+
+bool endswith(const std::string &str, const std::string &suffix)
+{
+ return str.size() >= suffix.size() &&
+ str.compare(str.size() - suffix.size(), suffix.size(), suffix) == 0;
+}
+
+extern "C" int LLVMFuzzerInitialize(int *argc, char ***argv)
+{
+ char* exe_path = (*argv)[0];
+ // dirname() can modify its argument.
+ char* exe_path_copy = strdup(exe_path);
+ char* dir = dirname(exe_path_copy);
+ DIR* d = opendir(dir);
+ struct dirent *direntry;
+ while ((direntry = readdir(d)) != NULL)
+ {
+ std::string entry(direntry->d_name);
+ if (endswith(entry, ".aff"))
+ {
+ std::string dic = entry.substr(0, entry.size() - 4) + ".dic";
+ dictionaries.emplace_back(new Hunspell(entry.c_str(), dic.c_str()));
+ }
+ }
+ closedir(d);
+ free(exe_path_copy);
+
+ return 0;
+}
+
+extern "C" int LLVMFuzzerTestOneInput(const char* data, size_t size)
+{
+ std::string word(data, size);
+ char **slist;
+ for (auto& dict : dictionaries)
+ {
+ if (!dict->spell(word.c_str()))
+ dict->suggest( &slist, word.c_str());
+ }
+ return 0;
+}
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
\ No newline at end of file