Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/155.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 相同的代码、相同的库版本、相同的编译器、不同的输出_C++_Yaml Cpp - Fatal编程技术网

C++ 相同的代码、相同的库版本、相同的编译器、不同的输出

C++ 相同的代码、相同的库版本、相同的编译器、不同的输出,c++,yaml-cpp,C++,Yaml 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.IsSequen

文件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";
}
屈服

[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)

在这种情况下,还有什么可能的解释呢?

如果我将Debian中的libyaml-cpp-0.5替换为libyaml-cpp-git存储库中的当前主分支(post 0.6.2),那么bug就会消失。这有力地支持了以下假设,即错误的原因是libyaml cpp中未定义的行为


我不会进一步调查。目前,我将使用0.6版。从长远来看,我将迁移到C库libyaml,它比libyaml cpp稳定得多。

您可能没有运行
a.out
您认为您正在一个或两个环境中运行,特别是如果
路径在这两个环境中不同。通过专门执行
/a.out
来避免这种风险,而不是依赖路径查找来查找可执行文件。有效点,但不是此处的解释。我将编辑该问题以排除这种可能性。最合理的解释是YAML库具有未定义的行为。您可以尝试在消毒液下运行它或手动检查代码。查看它的输出可能会有所帮助:
std::cout
node.Type()
output()也不同,
3
vs
1
,除非已明确识别该错误,“无需进一步调查”的想法似乎很可疑。你打算什么时候调查?飞机爆炸后?例如,如果这是由于代码中未初始化变量或未定义行为导致的结果,那么现在代码可能会意外地“工作”,准备稍后更努力地工作。有趣的问题是:像libyaml cpp这样的不真实库进入飞机软件的可能性有多大?我希望是零,但这不是我的决定。我不知道这个库,但在查看了一个文件(binary.cpp,按字母顺序排列的第一个,处理base64)后,我已经看到了几个问题(它使用
std::isspace(input[I])
忘记了强制转换为
(unsigned char)
和空白也被跳过,但在检查
输入[i-1]
处的“上一个”字符是否为等号时,不考虑这一点……如果上一个字符被跳过怎么办?)。
$ 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)