1 | //===-- ClangdFuzzer.cpp - Fuzz clangd ------------------------------------===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | /// |
9 | /// \file |
10 | /// This file implements a function that runs clangd on a single input. |
11 | /// This function is then linked into the Fuzzer library. |
12 | /// |
13 | //===----------------------------------------------------------------------===// |
14 | |
15 | #include "ClangdLSPServer.h" |
16 | #include "ClangdServer.h" |
17 | #include "support/ThreadsafeFS.h" |
18 | #include <cstdio> |
19 | |
20 | using namespace clang::clangd; |
21 | |
22 | extern "C" int LLVMFuzzerTestOneInput(uint8_t *Data, size_t Size) { |
23 | if (Size == 0) |
24 | return 0; |
25 | |
26 | // fmemopen isn't portable, but I think we only run the fuzzer on Linux. |
27 | std::FILE *In = fmemopen(s: Data, len: Size, modes: "r" ); |
28 | auto Transport = newJSONTransport(In, Out&: llvm::nulls(), |
29 | /*InMirror=*/nullptr, /*Pretty=*/false, |
30 | /*Style=*/JSONStreamStyle::Delimited); |
31 | RealThreadsafeFS FS; |
32 | CodeCompleteOptions CCOpts; |
33 | ClangdLSPServer::Options Opts; |
34 | Opts.CodeComplete.EnableSnippets = false; |
35 | Opts.UseDirBasedCDB = false; |
36 | |
37 | // Initialize and run ClangdLSPServer. |
38 | ClangdLSPServer LSPServer(*Transport, FS, Opts); |
39 | LSPServer.run(); |
40 | return 0; |
41 | } |
42 | |