Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/142.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++ -fsanize=带有叮当声的地址的不同输出+;vs g++;_C++_Gcc_Clang_Address Sanitizer - Fatal编程技术网

C++ -fsanize=带有叮当声的地址的不同输出+;vs g++;

C++ -fsanize=带有叮当声的地址的不同输出+;vs g++;,c++,gcc,clang,address-sanitizer,C++,Gcc,Clang,Address Sanitizer,在下面的代码中,我遇到了一个问题。当我给它一个仍然完全为空的向量时,代码崩溃,因为vector.size()-1不能为负数,因此它会换行。由于向量为空,访问容器[0]无效 using namespace std; template<typename T, typename A> std::string vec_to_python_list( const std::string& name, const vector<T, A>&a

在下面的代码中,我遇到了一个问题。当我给它一个仍然完全为空的向量时,代码崩溃,因为vector.size()-1不能为负数,因此它会换行。由于向量为空,访问容器[0]无效

using namespace std;

template<typename T, typename A>
std::string vec_to_python_list(
        const std::string& name,
        const vector<T, A>& container
        ) {
    std::stringstream stream(ios::out);
    stream << name << " = [" << '\n';
    for (typename vector<T, A>::size_type i = 0; i < container.size() - 1; i++)
        stream << "\t" << container[i] << ",\n";
    if (name.size() > 0)
        stream << "\t" << container[container.size() - 1] << "\n";
    stream << "]";
    return stream.str();
}
我获得下一个有用的信息:

#0 0x402a56 in std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > vec_to_python_list<double, std::allocator<double> >(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, std::vector<double, std::allocator<double> > const&) /home/hetepeperfan/programming/cpp/kmeans/test_kmeans.cpp:46
#1 0x401f07 in main /home/hetepeperfan/programming/cpp/kmeans/test_kmeans.cpp:66
#2 0x7f393881f82f in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x401ba8 in _start (/home/hetepeperfan/programming/cpp/kmeans/test_kmeans+0x401ba8)
我得到的结果不太有用:

#0 0x4eecae  (/home/hetepeperfan/programming/cpp/kmeans/test_kmeans+0x4eecae)
#1 0x4ee056  (/home/hetepeperfan/programming/cpp/kmeans/test_kmeans+0x4ee056)
#2 0x7f6ed883a82f  (/lib/x86_64-linux-gnu/libc.so.6+0x2082f)
#3 0x419838  (/home/hetepeperfan/programming/cpp/kmeans/test_kmeans+0x419838)
我做错了什么,以至于g++和-fsanize=address一起工作,而clang++不会产生有用的结果,似乎调试符号没有添加

编辑
调试符号似乎是存在的,因为使用gdb我可以轻松地逐步完成代码,使用--tui gdb选项我可以看到我的代码,所以这不是问题所在。

安装llvm符号器。 还可以将ASAN_symboler_PATH环境变量设置为

ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer

llvm正在查找名为
llvm-symboler
的可执行文件,而不是
llvm-symboler-3.8
,这就是环境变量必须指向没有版本号的文件名的原因。如果所有符号器的文件名中都有版本号,请创建一个没有版本号的符号链接。

安装llvm符号器。 还可以将ASAN_symboler_PATH环境变量设置为

ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer

llvm正在查找名为
llvm-symboler
的可执行文件,而不是
llvm-symboler-3.8
,这就是环境变量必须指向没有版本号的文件名的原因。如果所有符号器的文件名中都有版本号,请创建一个没有版本号的符号链接。

Related:@Ripi2这是Apple的东西。OP正在使用Ubuntu。@melpomene,Ripi2在撰写本文时并不知道,我后来在问题中添加了这些信息。相关:@Ripi2这是苹果的东西。OP正在使用Ubuntu。@melpomene,Ripi2在撰写本文时不知道,我在后面的问题中添加了这些信息。嗨,michael,谢谢你的回答,然而,我认为我的路径上有llvm符号器:
$哪个llvm-SymbolR-3.8/usr/bin/llvm-SymbolR-3.8
如果我把它放在我得到的路径上:==25910==错误:外部符号器路径设置为'/usr/bin/llvm-SymbolR-3.8',它不是已知的符号器。请设置llvm SYMBOLER二进制或其他已知工具的路径。显然,这还不够,因为llvm查找
llvm SYMBOLER
而不是
llvm-SYMBOLER-3.8
。感谢您的提示。它现在可以工作了。我在我的工作目录中创建了一个软链接,在我的/usr/bin目录中没有“-3.8”后缀,如果我把它放在路径
ASAN\u symbolr\u path=./llvm symbolr
上,它就可以工作了。Ubuntu-16.04上似乎有一个小的打包问题。很高兴能提供帮助。我在YouTube上的Jason Turner的“C++周刊”上看到了这个提示。嗨,michael,谢谢你的回答,然而,我认为我的路径上有llvm符号器:
$哪个llvm-SymbolR-3.8/usr/bin/llvm-SymbolR-3.8
如果我把它放在我得到的路径上:==25910==错误:外部符号器路径设置为'/usr/bin/llvm-SymbolR-3.8',它不是已知的符号器。请设置llvm SYMBOLER二进制或其他已知工具的路径。显然,这还不够,因为llvm查找
llvm SYMBOLER
而不是
llvm-SYMBOLER-3.8
。感谢您的提示。它现在可以工作了。我在我的工作目录中创建了一个软链接,在我的/usr/bin目录中没有“-3.8”后缀,如果我把它放在路径
ASAN\u symbolr\u path=./llvm symbolr
上,它就可以工作了。Ubuntu-16.04上似乎有一个小的打包问题。很高兴能提供帮助。我在YouTube上的Jason Turner的“C++周刊”中看到了这一技巧。
ASAN_SYMBOLIZER_PATH=/usr/lib/llvm-5.0/bin/llvm-symbolizer