BehaviorTree/BehaviorTree.CPP

Segmentation fault when Node not recognized

kgilarski opened this issue · 5 comments

There is a segmentation fault when using createTreeFromText with text containing unrecognized (unregistered) node.

The problem is in the current master branch. Branch 4.6.2 throws in such a case an exception:
Error at line X: -> Node not recognized: Y

Backtrace:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fa9b9dd1aaa in BT::VerifyXML(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, BT::NodeType, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, BT::NodeType> > > const&)::{lambda(tinyxml2::XMLElement const*)#2}::operator()(tinyxml2::XMLElement const*) const () from /usr/local/lib/libbehaviortree_cpp.so
[Current thread is 1 (Thread 0x7fa9b3fff6c0 (LWP 10))]
#0  0x00007fa9b9dd1aaa in BT::VerifyXML(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, BT::NodeType, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, BT::NodeType> > > const&)::{lambda(tinyxml2::XMLElement const*)#2}::operator()(tinyxml2::XMLElement const*) const () from /usr/local/lib/libbehaviortree_cpp.so
#1  0x00007fa9b9dd1670 in BT::VerifyXML(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, BT::NodeType, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, BT::NodeType> > > const&)::{lambda(tinyxml2::XMLElement const*)#2}::operator()(tinyxml2::XMLElement const*) const () from /usr/local/lib/libbehaviortree_cpp.so
#2  0x00007fa9b9dd1670 in BT::VerifyXML(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, BT::NodeType, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, BT::NodeType> > > const&)::{lambda(tinyxml2::XMLElement const*)#2}::operator()(tinyxml2::XMLElement const*) const () from /usr/local/lib/libbehaviortree_cpp.so
#3  0x00007fa9b9dd79ac in BT::VerifyXML(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::unordered_map<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> >, BT::NodeType, std::hash<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::equal_to<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > >, std::allocator<std::pair<std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const, BT::NodeType> > > const&) () from /usr/local/lib/libbehaviortree_cpp.so
#4  0x00007fa9b9dd82a3 in BT::XMLParser::PImpl::loadDocImpl(tinyxml2::XMLDocument*, bool) () from /usr/local/lib/libbehaviortree_cpp.so
#5  0x00007fa9b9d673ce in BT::BehaviorTreeFactory::createTreeFromText(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::shared_ptr<BT::Blackboard>) () from /usr/local/lib/libbehaviortree_cpp.so

Thanks. Do you have an example that can reproduce the error?

I can't provide an exact example, but I have prepared something which might help.

void execute(const string &xml) {
        BehaviorTreeFactory factory;
        auto tree_ptr = std::make_shared<BT::Tree>( factory.createTreeFromText( xml ));
}

where xml is as follows:
FED801.txt

The factory has registered 21 nodes using registerNodeType method but non of them is in the xml file.
The whole example is a situation when somebody delivers incorrect tree by mistake and we want to get an exception, not a segmentation fault.

i added a unit test, but i am not able to reproduce the error... 2793902

Maybe somebody fixed it in the meantime. Segmentation fault is in version 2025-02-05. In version 2025-02-09 there is an exception.

Below is the code I used to reproduce the problem.

#include "behaviortree_cpp/bt_factory.h"
#include <memory>
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>

int main() {

    std::ifstream file("../../resource/FED801.txt");  // Open the file
    if (!file) {  // Check if file opened successfully
        std::cerr << "Unable to open file\n";
        return 1;
    }

    std::stringstream buffer;
    buffer << file.rdbuf();  // Read the contents of the file into the stringstream

    std::string fileContents = buffer.str();  // Convert the stringstream to string
    std::cout << "File Contents:\n" << fileContents << std::endl;

    file.close();  // Close the file

    try {
        BT::BehaviorTreeFactory factory;
        auto tree_ptr = std::make_shared<BT::Tree>(factory.createTreeFromText(fileContents));
    } catch (std::exception & ex) {
        std::cout << "Exception: " << ex.what() << std::endl;
    }
}

Result depends on the BehaviourTree.CPP version:

2024-02-19
	commit 3073f2904921fa248185f293f046358c97a42eed (HEAD -> master, origin/master, origin/HEAD)
	Author: Davide Faconti <davide.faconti@gmail.com>
	Date:   Mon Feb 19 13:20:52 2024 +0100

	Exception: Error at line 5: -> Node not recognized: Is431
	
2025-02-05
	commit 370133ebd994b75f914c9bd0bda3e203777e70df (HEAD)
	Author: Davide Faconti <davide.faconti@gmail.com>
	Date:   Wed Feb 5 01:08:48 2025 +0100
	
	Naruszenie ochrony pamięci (zrzut pamięci) - Polish Segmentation Fault                
	
2025-02-09
	commit 87d2f03ea2828908402864a1df4fd61e689b4386 (HEAD -> master, origin/master, origin/HEAD)
	Author: Davide Faconti <davide.faconti@gmail.com>
	Date:   Sun Feb 9 21:43:47 2025 +0100

	Exception: Error at line 5: -> Unknown node type: Is431

in that case, I guess we can mark this "solved"