Ошибка Boost.PropertyTree при переборе некоторых пустых деревьев - PullRequest
0 голосов
/ 29 апреля 2019

Зацикливание на дочерних элементах пустого 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.

Как вы можете различить первый и второй тип пустых деревьев свойств, чтобы избежать перебора типа, который взрывается?

1 Ответ

1 голос
/ 29 апреля 2019

Проблема в том, что Boost.PropertyTree принимает это значение по умолчанию (временное) по ссылке const.И временный умирает немедленно , даже до того, как begin вызывается на него.

Вы не можете обнаружить эту проблему во время выполнения.Обходной путь должен иметь временную пустую ptree для использования по умолчанию.Это может быть const ptree, так что вы можете поделиться им между различными вызовами.Другое решение состоит в том, чтобы использовать этот трюк .

...