Files
carbon-lang/lexer/tokenized_buffer_fuzzer.cpp
T
Chandler Carruth d4a2d435b8 Enable most relevant clang-tidy checks and fix uncovered issues. (#220)
Most of these were fixed automatically (including things like adding
`[[nodiscard]]` and such). A number of others required manual edits.
I think all of them were pretty nice improvements.

There were a few places where the issues really stem from external
constraints and I've disabled the checks: GoogleTest macros or the
specific LibFuzzer entry points.

The only other places I disabled are the implicit conversions to
a private `enum` in the classes wrapping those `enum`s. These implicit
conversions are necessarily implicit to serve their only purpose:
enabling their use in `switch` statements and `case` labels. When these
were highlighted, it showed that one of these was actually converting to
an *`int`*. I've switched that to use the private `enum` instead as
doing so is important to enable warnings on non-covering `switch`
statements over than `enum`. And indeed, there is a `switch` that was
was implicitly relying on falling through in this way, so I've added the
explicit documentation of the intentional pattern to address that
warning.

Sorry this is so large, all of this somewhat fell out of enabling the
`clang-tidy` checks. If it is too difficult to review as lump, I can
work on breaking it apart as needed. Just let me know.
2020-12-08 14:43:37 -08:00

67 lines
2.1 KiB
C++

// Part of the Carbon Language project, under the Apache License v2.0 with LLVM
// Exceptions. See /LICENSE for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
#include <cstdint>
#include <cstring>
#include "diagnostics/diagnostic_emitter.h"
#include "lexer/tokenized_buffer.h"
#include "llvm/ADT/StringRef.h"
namespace Carbon {
// NOLINTNEXTLINE: Match the documented fuzzer entry point declaration style.
extern "C" int LLVMFuzzerTestOneInput(const unsigned char* data,
std::size_t size) {
// We need two bytes of data to compute a file name length.
if (size < 2) {
return 0;
}
uint16_t raw_filename_length;
std::memcpy(&raw_filename_length, data, 2);
data += 2;
size -= 2;
size_t filename_length = raw_filename_length;
// We need enough data to populate this filename length.
if (size < filename_length) {
return 0;
}
llvm::StringRef filename(reinterpret_cast<const char*>(data),
filename_length);
data += filename_length;
size -= filename_length;
// The rest of the data is the source text.
auto source = SourceBuffer::CreateFromText(
llvm::StringRef(reinterpret_cast<const char*>(data), size), filename);
// Use a real diagnostic emitter to get lazy codepaths to execute.
DiagnosticEmitter emitter = NullDiagnosticEmitter();
auto buffer = TokenizedBuffer::Lex(source, emitter);
if (buffer.HasErrors()) {
return 0;
}
// Walk the lexed and tokenized buffer to ensure it isn't corrupt in some way.
//
// TODO: We should enhance this to do more sanity checks on the resulting
// token stream.
for (TokenizedBuffer::Token token : buffer.Tokens()) {
int line_number = buffer.GetLineNumber(token);
(void)line_number;
assert(line_number > 0 && "Invalid line number!");
assert(line_number < INT_MAX && "Invalid line number!");
int column_number = buffer.GetColumnNumber(token);
(void)column_number;
assert(column_number > 0 && "Invalid line number!");
assert(column_number < INT_MAX && "Invalid line number!");
}
return 0;
}
} // namespace Carbon