/src/behaviortreecpp/fuzzing/script_fuzzer.cpp
Line | Count | Source (jump to first uncovered line) |
1 | | #include <fuzzer/FuzzedDataProvider.h> |
2 | | #include "behaviortree_cpp/scripting/script_parser.hpp" |
3 | | #include "behaviortree_cpp/blackboard.h" |
4 | | #include "behaviortree_cpp/basic_types.h" |
5 | | #include <cstdint> |
6 | | #include <string> |
7 | | #include <iostream> |
8 | | #include <iomanip> |
9 | | |
10 | | extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) |
11 | 18 | { |
12 | 18 | if(size < 4) |
13 | 0 | { |
14 | 0 | return 0; |
15 | 0 | } |
16 | | |
17 | 18 | FuzzedDataProvider fuzz_data(data, size); |
18 | | |
19 | 18 | try |
20 | 18 | { |
21 | 18 | BT::Ast::Environment env; |
22 | 18 | env.vars = BT::Blackboard::create(); |
23 | 18 | env.enums = std::make_shared<BT::EnumsTable>(); |
24 | | |
25 | | // Add some test variables to the blackboard |
26 | 18 | env.vars->set("test_int", 42); |
27 | 18 | env.vars->set("test_double", 3.14); |
28 | 18 | env.vars->set("test_bool", true); |
29 | 18 | env.vars->set("test_string", std::string("test")); |
30 | | |
31 | | // Add some test enums |
32 | 18 | (*env.enums)["RUNNING"] = 0; |
33 | 18 | (*env.enums)["SUCCESS"] = 1; |
34 | 18 | (*env.enums)["FAILURE"] = 2; |
35 | | |
36 | 18 | std::string script = fuzz_data.ConsumeRandomLengthString(); |
37 | | |
38 | 18 | auto validation_result = BT::ValidateScript(script); |
39 | | |
40 | 18 | if(!validation_result) |
41 | 15 | { |
42 | 15 | auto parsed_script = BT::ParseScript(script); |
43 | 15 | if(parsed_script) |
44 | 0 | { |
45 | 0 | try |
46 | 0 | { |
47 | 0 | auto result = parsed_script.value()(env); |
48 | |
|
49 | 0 | if(result.isNumber()) |
50 | 0 | { |
51 | 0 | volatile auto num = result.cast<double>(); |
52 | 0 | } |
53 | |
|
54 | 0 | env.vars->set("result", result); |
55 | |
|
56 | 0 | BT::Any read_back; |
57 | 0 | env.vars->get("result", read_back); |
58 | 0 | } |
59 | 0 | catch(const BT::RuntimeError&) |
60 | 0 | {} |
61 | 0 | } |
62 | 15 | } |
63 | | |
64 | 18 | BT::ParseScriptAndExecute(env, script); |
65 | 18 | } |
66 | 18 | catch(const std::exception&) |
67 | 18 | {} |
68 | | |
69 | 18 | return 0; |
70 | 18 | } |