summaryrefslogtreecommitdiffstats
path: root/clangd/fuzzer/clangd-fuzzer.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clangd/fuzzer/clangd-fuzzer.cpp')
-rw-r--r--clangd/fuzzer/clangd-fuzzer.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/clangd/fuzzer/clangd-fuzzer.cpp b/clangd/fuzzer/clangd-fuzzer.cpp
new file mode 100644
index 00000000..5e7de771
--- /dev/null
+++ b/clangd/fuzzer/clangd-fuzzer.cpp
@@ -0,0 +1,43 @@
+//===-- ClangdFuzzer.cpp - Fuzz clangd ------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+///
+/// \file
+/// \brief This file implements a function that runs clangd on a single input.
+/// This function is then linked into the Fuzzer library.
+///
+//===----------------------------------------------------------------------===//
+
+#include "ClangdLSPServer.h"
+#include "ClangdServer.h"
+#include "CodeComplete.h"
+#include "FSProvider.h"
+#include <cstdio>
+#include <sstream>
+
+using namespace clang::clangd;
+
+extern "C" int LLVMFuzzerTestOneInput(uint8_t *data, size_t size) {
+ if (size == 0)
+ return 0;
+
+ // fmemopen isn't portable, but I think we only run the fuzzer on Linux.
+ std::FILE *In = fmemopen(data, size, "r");
+ auto Transport = newJSONTransport(In, llvm::nulls(),
+ /*InMirror=*/nullptr, /*Pretty=*/false,
+ /*Style=*/JSONStreamStyle::Delimited);
+ RealFileSystemProvider FS;
+ CodeCompleteOptions CCOpts;
+ CCOpts.EnableSnippets = false;
+ ClangdServer::Options Opts;
+
+ // Initialize and run ClangdLSPServer.
+ ClangdLSPServer LSPServer(*Transport, FS, CCOpts, llvm::None, false,
+ llvm::None, Opts);
+ LSPServer.run();
+ return 0;
+}