Repository navigation
Expand file tree
/
Copy pathscript_fuzzer.cpp
More file actions
76 lines (61 loc) · 1.77 KB
/
Copy pathscript_fuzzer.cpp
File metadata and controls
76 lines (61 loc) · 1.77 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "behaviortree_cpp/basic_types.h"
#include "behaviortree_cpp/blackboard.h"
#include "behaviortree_cpp/scripting/script_parser.hpp"
#include <cstdint>
#include <iomanip>
#include <iostream>
#include <string>
#include <fuzzer/FuzzedDataProvider.h>
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
if(size < 4)
{
return 0;
}
FuzzedDataProvider fuzz_data(data, size);
try
{
BT::Ast::Environment env;
env.vars = BT::Blackboard::create();
env.enums = std::make_shared<BT::EnumsTable>();
// Add some test variables to the blackboard
env.vars->set("test_int", 42);
env.vars->set("test_double", 3.14);
env.vars->set("test_bool", true);
env.vars->set("test_string", std::string("test"));
// Add some test enums
(*env.enums)["RUNNING"] = 0;
(*env.enums)["SUCCESS"] = 1;
(*env.enums)["FAILURE"] = 2;
std::string script = fuzz_data.ConsumeRandomLengthString();
auto validation_result = BT::ValidateScript(script);
if(!validation_result)
{
auto parsed_script = BT::ParseScript(script);
if(parsed_script)
{
try
{
auto result = parsed_script.value()(env);
if(result.isNumber())
{
volatile auto num = result.cast<double>();
}
env.vars->set("result", result);
BT::Any read_back;
(void)env.vars->get("result", read_back);
}
catch(const BT::RuntimeError&) // NOLINT(bugprone-empty-catch)
{
// Intentionally empty - fuzzer expects exceptions
}
}
}
BT::ParseScriptAndExecute(env, script);
}
catch(const std::exception&) // NOLINT(bugprone-empty-catch)
{
// Intentionally empty - fuzzer expects exceptions
}
return 0;
}