тот же код, та же версия библиотеки, тот же компилятор, другой вывод - PullRequest
0 голосов
/ 10 ноября 2018

Файл h.cpp

#include "yaml-cpp/yaml.h"
#include <iostream>
int main() {
    YAML::Node node = YAML::Load("[1, 2, 3]");
    std::cout << node << "\n";
    std::cout << node.Type() << "\n";
    std::cout << node.IsSequence() << "\n";
}

скомпилировано и выполнено с

g++ -lyaml-cpp h.cpp && ./a.out

выходы

[1, 2, 3]
3
1

на моем рабочем столе, но

[1, 2, 3]
1
0

на моем ноутбуке. Последняя строка вывода на ноутбук неверна: наверняка, данная строка YAML является последовательностью.

Те же результаты, когда g ++ заменяется на clang ++. На обеих машинах установлен один и тот же Debian 4.18.10-2, обе x86_64, на обеих - Linux 4.18.0-2-amd64, обе имеют одинаковые версии g ++ и clang ++. Обе версии имеют одинаковую версию библиотеки yaml-cpp, которая была недавно переустановлена:

$ locate libyaml-cpp.
/usr/lib/x86_64-linux-gnu/libyaml-cpp.a
/usr/lib/x86_64-linux-gnu/libyaml-cpp.so
/usr/lib/x86_64-linux-gnu/libyaml-cpp.so.0.5
/usr/lib/x86_64-linux-gnu/libyaml-cpp.so.0.5.2

$ dpkg -S /usr/lib/x86_64-linux-gnu/libyaml-cpp.a
libyaml-cpp-dev: /usr/lib/x86_64-linux-gnu/libyaml-cpp.a
$ dpkg -S /usr/lib/x86_64-linux-gnu/libyaml-cpp.so.0.5.2
libyaml-cpp0.5v5:amd64: /usr/lib/x86_64-linux-gnu/libyaml-cpp.so.0.5.2

$ apt-cache show libyaml-cpp-dev
Package: libyaml-cpp-dev
Source: yaml-cpp
Version: 0.5.2-4
$ apt-cache show libyaml-cpp0.5v5
Package: libyaml-cpp0.5v5
Source: yaml-cpp
Version: 0.5.2-4

Вывод ldd идентичен, за исключением шестнадцатеричных адресов в скобках:

$ ldd a.out
    linux-vdso.so.1 (0x00007ffd0d5f0000)
    libyaml-cpp.so.0.5 => /usr/lib/x86_64-linux-gnu/libyaml-cpp.so.0.5 (0x00007f1e9fcd8000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f1e9fb55000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f1e9f9c1000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f1e9f9a7000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f1e9f7ea000)
    /lib64/ld-linux-x86-64.so.2 (0x00007f1e9ff79000)

Какие возможные объяснения остаются в такой ситуации?

1 Ответ

0 голосов
/ 02 декабря 2018

Ошибка исчезнет, ​​если я заменим libyaml-cpp-0.5 из Debian на текущую главную ветку (post 0.6.2) из ​​репозитория libyaml-cpp git. Это убедительно подтверждает гипотезу о том, что причиной ошибки является неопределенное поведение в libyaml-cpp.

Я не буду продолжать расследование. Пока я буду использовать версию 0.6. В конечном итоге я перейду на библиотеку C libyaml, которая гораздо более стабильна, чем libyaml-cpp.

...