Зацикливание на дочерних элементах пустого Boost.PropertyTree обычно не допускается:
ptree empty;
for (auto const& elements : empty)
{
std::cout << "child\n"; // Executed 0 times, as expected
}
но иногда происходит сбой с нарушением прав доступа:
ptree empty;
for (auto const& elements : empty.get_child("non-existent", ptree{})))
{
std::cout << "child\n";
}
Место чтения нарушения доступа 0xFFFFFFFFFFFFFFFF.
(Внутри basic_ptree<K, D, C>::begin() const
)
Теперь, очевидно, empty
не имеет дочернего "несуществующего", но есть значение по умолчанию (ptree{}
). Из первого примера мы знаем, что можно зацикливаться на пустой коллекции.
Обычный способ обнаружения сбоя чтения не работает, так как это нарушение прав доступа / неопределенное поведение внутри Boost.PropertyTree.
Как вы можете различить первый и второй тип пустых деревьев свойств, чтобы избежать перебора типа, который взрывается?