MCPcopy Create free account
hub / github.com/BehaviorTree/BehaviorTree.CPP / LLVMFuzzerTestOneInput

Function LLVMFuzzerTestOneInput

fuzzing/bt_fuzzer.cpp:63–127  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

61}
62
63extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
64{
65 if(size < 4)
66 {
67 return 0;
68 }
69
70 FuzzedDataProvider fdp(data, size);
71 BT::BehaviorTreeFactory factory;
72
73 try
74 {
75 // Strategy 1: Test with completely random data
76 if(fdp.ConsumeBool())
77 {
78 std::string random_xml = fdp.ConsumeRandomLengthString(size - 1);
79 try
80 {
81 factory.createTreeFromText(random_xml);
82 }
83 catch(const std::exception&)
84 {}
85 }
86 // Strategy 2: Generate semi-valid XML
87 else
88 {
89 std::string xml = R"(
90 <root BTCPP_format="4">
91 <BehaviorTree ID="MainTree">)";
92
93 size_t num_nodes = fdp.ConsumeIntegralInRange<size_t>(1, 5);
94 for(size_t i = 0; i < num_nodes; i++)
95 {
96 xml += generateFuzzedNodeXML(fdp);
97 }
98
99 xml += R"(
100 </BehaviorTree>
101 </root>)";
102
103 auto blackboard = BT::Blackboard::create();
104
105 switch(fdp.ConsumeIntegralInRange<int>(0, 2))
106 {
107 case 0:
108 factory.createTreeFromText(xml, blackboard);
109 break;
110 case 1:
111 BT::VerifyXML(xml, {});
112 break;
113 case 2:
114 factory.registerBehaviorTreeFromText(xml);
115 if(!factory.registeredBehaviorTrees().empty())
116 {
117 factory.createTree(factory.registeredBehaviorTrees().front(), blackboard);
118 }
119 break;
120 }

Callers

nothing calls this directly

Calls 8

generateFuzzedNodeXMLFunction · 0.85
createFunction · 0.85
VerifyXMLFunction · 0.85
createTreeFromTextMethod · 0.80
createTreeMethod · 0.80
emptyMethod · 0.45

Tested by

no test coverage detected