42 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8///9/// \file10/// 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 20using namespace clang::clangd;21 22extern "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(Data, Size, "r");28 auto Transport = newJSONTransport(In, 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