- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
gcc-6.2 的 Ubuntu 版本((Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901)不再有这个问题。
我正在使用 gcc-6.1[1] ((Ubuntu 6.1.1-3ubuntu11~14.04.1) 6.1.1 20160511)、GNU binutils 2.24 和支持 GLIBCXX_3.4.22 的 libstdc++ 的 Ubuntu 版本。即使在一个简单的“hello world”程序中,指定 sanitizer 也不会强制使用黄金链接器。
#include <iostream>
int main() {
std::cout << "Hello, world!\n";
}
编译和链接
g++ -fsanitize=address -c -o main main.cpp
g++ -fsanitize=address -o main main.o
给出错误
/usr/bin/ld: unrecognized option '--push-state'
/usr/bin/ld: use the --help option for usage information
collect2: error: ld returned 1 exit status
这表明 -fsanitize
选项没有选择黄金链接器。当然,简单的解决方法是在链接期间使用 -fuse-ld=gold
,但之前的 gcc 版本在使用 sanitizers 时不需要这个。例如,这段代码在 gcc-5.3 和 4.9(都是 Ubuntu 版本)下运行良好。其他人对 gcc-6.1 的非 Ubuntu 版本有这个问题吗? Ubuntu 构建是否损坏?
[1] 使用以下标志构建(gcc-5.3 和 gcc-4.9 构建时只有名称和后缀不同)
--with-pkgversion='Ubuntu 6.1.1-3ubuntu11~14.04.1'
--with-bugurl=file:///usr/share/doc/gcc-6/README.Bugs
--enable-languages=c,ada,c++,java,go,d,fortran,objc,obj-c++
--prefix=/usr
--program-suffix=-6
--enable-shared
--enable-linker-build-id
--libexecdir=/usr/lib
--without-included-gettext
--enable-threads=posix
--libdir=/usr/lib
--enable-nls
--with-sysroot=/
--enable-clocale=gnu
--enable-libstdcxx-debug
--enable-libstdcxx-time=yes
--with-default-libstdcxx-abi=gcc4-compatible
--disable-libstdcxx-dual-abi
--enable-gnu-unique-object
--disable-vtable-verify
--enable-libmpx
--enable-plugin
--with-system-zlib
--disable-browser-plugin
--enable-java-awt=gtk
--enable-gtk-cairo
--with-java-home=/usr/lib/jvm/java-1.5.0-gcj-6-amd64/jre
--enable-java-home
--with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-6-amd64
--with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-6-amd64
--with-arch-directory=amd64
--with-ecj-jar=/usr/share/java/eclipse-ecj.jar
--enable-objc-gc
--enable-multiarch
--disable-werror
--with-arch-32=i686
--with-abi=m64
--with-multilib-list=m32,m64,mx32
--enable-multilib
--with-tune=generic
--enable-checking=release
--build=x86_64-linux-gnu
--host=x86_64-linux-gnu
--target=x86_64-linux-gnu
最佳答案
对我来说同样的问题和相同的解决方案使用
-fuse-ld=gold
关于c++ - -fsanitize 在 GCC-6.1 中不使用黄金链接器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37603238/
我正在尝试使用 conda g++ 编译器使用 -fsanitize=undefined 编译程序。我遇到了“__ubsan_handle_type_mismatch”链接器错误。我在编译和链接中使用
我正在尝试编写一些代码来创建一个排序的链表,并仅插入唯一元素,以使链表保持排序。另外,我实现了一个函数来删除具有给定值的节点和一个打印它的节点。 我有一些必须运行的测试用例,测试软件需要 main.c
使用 -fsanitize 进行编译时,我是否必须使用它来编译每个目标? 我有一些不受它支持的目标(汇编和 C 目标)。 主要可执行文件是受支持的 C++ 文件。 fsanitize 有效吗?或者我需
编译像这样的cpp程序时 int main() { int a[5][5]; cout << a[5][5]; } 使用 -fsanitzie=address 编译时出现运行时异常,但是 in
我想在使用内存清理程序时清除 FD_ZERO 和 FD_SET 上的误报。清除它有点容易: #include ... __msan_unpoison(&readfds, sizeof(readfds
我正在开发一个大型 C++ 项目,用 clang 编译它会很痛苦,所以我坚持使用 GCC。 我想使用很好的 -fsanitize=leak 标志,我在之前的工作中已经与 clang 一起使用过该标志,
我发现这段代码使用“-fsanitize=undefined,address”和不使用它会产生不同的结果。 int printf(const char *, ...); union { long
我在这里有一个小的单元测试,它具有未定义的行为。 源代码: #include TEST(test, test) { int k = 0x7fffffff; k += 1; // ca
我正在使用gcc (SUSE Linux) 7.2.1 20171020编译以下C程序strcmp.c: #include #include int main () { char str1[
我遇到了一个错误无法始终重现,其中 free()在无效的堆指针上调用。对于有问题的代码,根本不可能将此问题减少到“最小”——(一旦我这样做了,它就解决了)。我无法发现任何明显的问题(例如从未调用 ca
当我使用 -fsanitize=address 编译我的 C++ 代码时,我的软件在退出时会打印出泄漏列表。有没有办法避免泄漏报告(我只对内存损坏感兴趣,而不是泄漏)?我用 ASAN flags pa
我正在尝试使用 -fsanitize=bounds 选项找出代码中的越界问题,但我遇到了奇怪的行为: 例如在下面的代码中: #include #include int main (int, cha
将 -fsanitize=address -fno-omit-frame-pointer 与 clang 一起使用时需要注意什么?我经历了一些奇怪的事情debugging behaviour (std
我有一个用 g++ 正常编译的 MEX 文件。 我最近将其编译更改为使用 clang++,并将 -fsanitize=address 包含到 LDFLAGS 和 CFLAGS 中(注意:没有 CXX该
我正在尝试使用 asan 调试 clang 检测到的内存错误,但 valgrind 错过了。但是我无法让我的 clang 构建二进制文件来给我任何有用的调试信息。我可以用一个简短的测试程序来证明这一点
更新(2016 年 9 月 30 日) gcc-6.2 的 Ubuntu 版本((Ubuntu 6.2.0-3ubuntu11~16.04) 6.2.0 20160901)不再有这个问题。 我正在使用
我想知道 gcc 的 -fsanitize=address 选项与 tcmalloc 一起使用吗?还是我们需要通过禁用 tcmalloc 来运行?或者如果启用 tcmalloc 运行 sanitize
在下面的代码中我遇到了问题。当我给它一个仍然完全为空的 vector 时,代码崩溃,因为 vector.size() - 1 不能为负,因此它环绕。因为 vector 是空的,所以访问 contain
char t = 'a'; char * p1 = &t; char** p2 = &p1; std::cout << p2 << " " << *p2 << " " << **p2 << '\n';
我一直在尝试利用一些 GCC Instrumentation Options用于运行时检查以尝试调试/诊断我在 C++ 代码的特定区域中遇到的问题。 为了尝试缩小问题范围,我开始启用其中一些功能,但在
我是一名优秀的程序员,十分优秀!