xref: /llvm-project/clang-tools-extra/clangd/fuzzer/clangd-fuzzer.cpp (revision 8edfc2f814fe107bf31e3470478aa9bcacdf5aed)
1920f6c81SNico Weber //===-- ClangdFuzzer.cpp - Fuzz clangd ------------------------------------===//
2920f6c81SNico Weber //
3920f6c81SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4920f6c81SNico Weber // See https://llvm.org/LICENSE.txt for license information.
5920f6c81SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6920f6c81SNico Weber //
7920f6c81SNico Weber //===----------------------------------------------------------------------===//
8920f6c81SNico Weber ///
9920f6c81SNico Weber /// \file
10282dc72cSDmitri Gribenko /// This file implements a function that runs clangd on a single input.
11920f6c81SNico Weber /// This function is then linked into the Fuzzer library.
12920f6c81SNico Weber ///
13920f6c81SNico Weber //===----------------------------------------------------------------------===//
14920f6c81SNico Weber 
15920f6c81SNico Weber #include "ClangdLSPServer.h"
16920f6c81SNico Weber #include "ClangdServer.h"
170628705eSKadir Cetinkaya #include "support/ThreadsafeFS.h"
18920f6c81SNico Weber #include <cstdio>
19920f6c81SNico Weber 
20920f6c81SNico Weber using namespace clang::clangd;
21920f6c81SNico Weber 
LLVMFuzzerTestOneInput(uint8_t * Data,size_t Size)22*8edfc2f8SChristian Kühnel extern "C" int LLVMFuzzerTestOneInput(uint8_t *Data, size_t Size) {
23*8edfc2f8SChristian Kühnel   if (Size == 0)
24920f6c81SNico Weber     return 0;
25920f6c81SNico Weber 
26920f6c81SNico Weber   // fmemopen isn't portable, but I think we only run the fuzzer on Linux.
27*8edfc2f8SChristian Kühnel   std::FILE *In = fmemopen(Data, Size, "r");
28920f6c81SNico Weber   auto Transport = newJSONTransport(In, llvm::nulls(),
29920f6c81SNico Weber                                     /*InMirror=*/nullptr, /*Pretty=*/false,
30920f6c81SNico Weber                                     /*Style=*/JSONStreamStyle::Delimited);
310628705eSKadir Cetinkaya   RealThreadsafeFS FS;
32920f6c81SNico Weber   CodeCompleteOptions CCOpts;
33d99f46c6SSam McCall   ClangdLSPServer::Options Opts;
34d99f46c6SSam McCall   Opts.CodeComplete.EnableSnippets = false;
35d99f46c6SSam McCall   Opts.UseDirBasedCDB = false;
36920f6c81SNico Weber 
37920f6c81SNico Weber   // Initialize and run ClangdLSPServer.
38d99f46c6SSam McCall   ClangdLSPServer LSPServer(*Transport, FS, Opts);
39920f6c81SNico Weber   LSPServer.run();
40920f6c81SNico Weber   return 0;
41920f6c81SNico Weber }
42