brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.3 KiB · 9a572c1 Raw
46 lines · cpp
1//===-- yaml-numeric-parser-fuzzer.cpp - Fuzzer for YAML numeric parser ---===//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#include "llvm/ADT/StringRef.h"10#include "llvm/Support/Regex.h"11#include "llvm/Support/YAMLTraits.h"12#include <string>13 14inline bool isNumericRegex(llvm::StringRef S) {15  static llvm::Regex Infinity("^[-+]?(\\.inf|\\.Inf|\\.INF)$");16  static llvm::Regex Base8("^0o[0-7]+$");17  static llvm::Regex Base16("^0x[0-9a-fA-F]+$");18  static llvm::Regex Float(19      "^[-+]?(\\.[0-9]+|[0-9]+(\\.[0-9]*)?)([eE][-+]?[0-9]+)?$");20 21  if (S == ".nan" || S == ".NaN" || S == ".NAN")22    return true;23 24  if (Infinity.match(S))25    return true;26 27  if (Base8.match(S))28    return true;29 30  if (Base16.match(S))31    return true;32 33  if (Float.match(S))34    return true;35 36  return false;37}38 39extern "C" int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size) {40  std::string Input(reinterpret_cast<const char *>(Data), Size);41  llvm::erase(Input, 0);42  if (!Input.empty() && llvm::yaml::isNumeric(Input) != isNumericRegex(Input))43    LLVM_BUILTIN_TRAP;44  return 0;45}46