[libc-commits] [PATCH] D143784: [libc] Add basic fuzz target for the printf parser

Michael Jones via Phabricator via libc-commits libc-commits at lists.llvm.org
Fri Feb 10 15:03:39 PST 2023


michaelrj created this revision.
michaelrj added reviewers: sivachandra, lntue.
Herald added subscribers: libc-commits, ecnelises, tschuett.
Herald added projects: libc-project, All.
michaelrj requested review of this revision.

The goal is to fuzz the entirety of printf, but the plan is to do it in
pieces for simplicity. This test fuzzes just the parser, while later
tests will fuzz the converters. This also adds a mock version of the
arg_list class.


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D143784

Files:
  libc/fuzzing/CMakeLists.txt
  libc/fuzzing/stdio/CMakeLists.txt
  libc/fuzzing/stdio/mock_arg_list.h


Index: libc/fuzzing/stdio/mock_arg_list.h
===================================================================
--- /dev/null
+++ libc/fuzzing/stdio/mock_arg_list.h
@@ -0,0 +1,42 @@
+//===-- Mock arg list -------------------------------------------*- C++ -*-===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_FUZZING_STDIO_MOCK_ARG_LIST_H
+#define LLVM_LIBC_FUZZING_STDIO_MOCK_ARG_LIST_H
+
+#include "src/__support/common.h"
+
+#include "src/__support/arg_list.h"
+
+namespace __llvm_libc {
+namespace internal {
+class MockArgList : public ArgList {
+  int arg_counter = 0;
+
+public:
+  LIBC_INLINE MockArgList(ArgList any_arg_list) : ArgList(any_arg_list){};
+  LIBC_INLINE MockArgList(MockArgList &other) : ArgList(other) {
+    this->arg_counter = other.arg_counter;
+  }
+  LIBC_INLINE ~MockArgList() = default;
+
+  LIBC_INLINE MockArgList &operator=(MockArgList &rhs) {
+    arg_counter = rhs.arg_counter;
+    return *this;
+  }
+
+  template <class T> LIBC_INLINE T next_var() {
+    ++arg_counter;
+    return static_cast<T>(arg_counter);
+  }
+};
+
+} // namespace internal
+} // namespace __llvm_libc
+
+#endif // LLVM_LIBC_FUZZING_STDIO_MOCK_ARG_LIST_H
Index: libc/fuzzing/stdio/CMakeLists.txt
===================================================================
--- /dev/null
+++ libc/fuzzing/stdio/CMakeLists.txt
@@ -0,0 +1,17 @@
+add_header_library(
+  mock_arg_list
+  HDRS
+    mock_arg_list.h
+  DEPENDS
+    libc.src.__support.arg_list
+    libc.src.__support.common
+)
+
+add_libc_fuzzer(
+  printf_parser_fuzz
+  SRCS
+    printf_parser_fuzz.cpp
+  DEPENDS
+    libc.src.stdio.printf_core.parser
+    .mock_arg_list
+)
Index: libc/fuzzing/CMakeLists.txt
===================================================================
--- libc/fuzzing/CMakeLists.txt
+++ libc/fuzzing/CMakeLists.txt
@@ -3,4 +3,5 @@
 
 add_subdirectory(math)
 add_subdirectory(stdlib)
+add_subdirectory(stdio)
 add_subdirectory(string)


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143784.496611.patch
Type: text/x-patch
Size: 2195 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/libc-commits/attachments/20230210/16ed66ce/attachment-0001.bin>


More information about the libc-commits mailing list