相同的代码,相同的库版本,相同的编译器,不同的输出
same code, same library version, same compiler, different output
文件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++ 和铛++。两者具有相同的 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)
在这种情况下还有什么可能的解释?
如果我用 libyaml-cpp git 存储库中的当前主分支 (post 0.6.2) 替换 Debian 中的 libyaml-cpp-0.5,该错误就会消失。这有力地支持了 bug 的原因是 libyaml-cpp 中的未定义行为的假设。
我不会进一步调查。目前,我将使用 0.6 版。漫长的运行,我会迁移到C库libyaml,比libyaml-cpp稳定多了
文件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++ 和铛++。两者具有相同的 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)
在这种情况下还有什么可能的解释?
如果我用 libyaml-cpp git 存储库中的当前主分支 (post 0.6.2) 替换 Debian 中的 libyaml-cpp-0.5,该错误就会消失。这有力地支持了 bug 的原因是 libyaml-cpp 中的未定义行为的假设。
我不会进一步调查。目前,我将使用 0.6 版。漫长的运行,我会迁移到C库libyaml,比libyaml-cpp稳定多了