Flutter Engine
The Flutter Engine
Loading...
Searching...
No Matches
dart_libfuzzer.cc
Go to the documentation of this file.
1// Copyright (c) 2019, the Dart project authors. Please see the AUTHORS file
2// for details. All rights reserved. Use of this source code is governed by a
3// BSD-style license that can be found in the LICENSE file.
4
5#include <stddef.h>
6#include <stdint.h>
7
8#include "bin/dartutils.h"
10#include "platform/unicode.h"
11#include "platform/utils.h"
12#include "vm/json_writer.h"
13
14// Defines target function.
15static int target = 0;
16
17// Target function that stresses some unicode methods.
18// Found: http://dartbug.com/36235
19static int TestUnicode(const uint8_t* Data, size_t Size) {
21 dart::Utf8::CodeUnitCount(Data, Size, &type);
22 dart::Utf8::IsValid(Data, Size);
23 int32_t dst = 0;
24 dart::Utf8::Decode(Data, Size, &dst);
25 uint16_t dst16[1024];
26 dart::Utf8::DecodeToUTF16(Data, Size, dst16, 1024);
27 int32_t dst32[1024];
28 dart::Utf8::DecodeToUTF32(Data, Size, dst32, 1024);
29 dart::Utf8::ReportInvalidByte(Data, Size, 1024);
30 return 0;
31}
32
33// Target function that stresses various utilities.
34// Found: http://dartbug.com/36818
35static int TestUtilities(const uint8_t* Data, size_t Size) {
36 dart::Utils::StringHash(reinterpret_cast<const char*>(Data), Size);
38 // Text buffer.
40 for (size_t i = 0; i < Size; i++) {
41 buffer.AddChar(Data[i]);
42 }
43 if (static_cast<size_t>(buffer.length()) != Size) return 1;
44 buffer.AddRaw(Data, Size);
45 if (static_cast<size_t>(buffer.length()) != 2 * Size) return 1;
46 free(buffer.Steal());
47 buffer.AddRaw(Data, Size);
48 if (static_cast<size_t>(buffer.length()) != Size) return 1;
49 // Json writer.
50 dart::JSONWriter writer(1);
51 writer.OpenObject("object");
52 writer.AppendBytes(Data, Size);
53 writer.CloseObject();
54 for (size_t i = 0; i < Size; i++) {
55 writer.PrintValue(static_cast<intptr_t>(Data[i]));
56 }
57 writer.PrintValueBase64(Data, Size);
58 return 0;
59}
60
61// Dart VM specific initialization.
62static int InitDartVM() {
63 // TODO(ajcbik): one-time setup of Dart VM.
64 return 0;
65}
66
67// Libfuzzer one time initialization.
68extern "C" int LLVMFuzzerInitialize(int* argc_in, char*** argv_in) {
69 // Parse --t=<target> from command line.
70 int argc = *argc_in;
71 char** argv = *argv_in;
72 while (--argc > 0) {
73 char* ptr = *++argv;
74 if (*ptr++ == '-' && *ptr++ == '-' && *ptr++ == 't' && *ptr++ == '=') {
75 target = atoi(ptr);
76 }
77 }
78 // Initialize Dart VM.
79 return InitDartVM();
80}
81
82// Libfuzzer target functions:
83// 0 : unicode
84// 1 : utilities
85extern "C" int LLVMFuzzerTestOneInput(const uint8_t* Data, size_t Size) {
86 switch (target) {
87 case 0:
88 return TestUnicode(Data, Size);
89 case 1:
90 return TestUtilities(Data, Size);
91 default:
92 fprintf(stderr, "dart_libfuzzer: invalid target --t=%d\n", target);
93 return 1;
94 }
95}
void PrintValue(intptr_t i)
void PrintValueBase64(const uint8_t *bytes, intptr_t length)
void AppendBytes(const uint8_t *buffer, intptr_t buffer_length)
void OpenObject(const char *property_name=nullptr)
static bool DecodeToUTF32(const uint8_t *utf8_array, intptr_t array_len, int32_t *dst, intptr_t len)
Definition unicode.cc:245
static intptr_t CodeUnitCount(const uint8_t *utf8_array, intptr_t array_len, Type *type)
Definition unicode.cc:46
static intptr_t ReportInvalidByte(const uint8_t *utf8_array, intptr_t array_len, intptr_t len)
Definition unicode.cc:163
static bool IsValid(const uint8_t *utf8_array, intptr_t array_len)
Definition unicode.cc:70
static bool DecodeToUTF16(const uint8_t *utf8_array, intptr_t array_len, uint16_t *dst, intptr_t len)
Definition unicode.cc:217
static intptr_t Decode(const uint8_t *utf8_array, intptr_t array_len, int32_t *ch)
Definition unicode.cc:135
static uint32_t StringHash(const void *data, int length)
Definition utils.cc:114
static MagicNumber SniffForMagicNumber(const char *filename)
Definition dartutils.cc:407
static int TestUnicode(const uint8_t *Data, size_t Size)
int LLVMFuzzerTestOneInput(const uint8_t *Data, size_t Size)
static int InitDartVM()
int LLVMFuzzerInitialize(int *argc_in, char ***argv_in)
static int TestUtilities(const uint8_t *Data, size_t Size)
static int target
static const uint8_t buffer[]
char ** argv
Definition library.h:9