草庐IT

c++ - GCC Address Sanitizer - 将库函数列入黑名单(特别是 boost::test)

我所有的单元测试代码都基于boost::test。我刚刚尝试了GCCAddresssanitizer,它报告了boost::test的一些问题:==25309==ERROR:AddressSanitizer:heap-use-after-freeonaddress0xf5801344atpc0x8259412bp0xff9966c8sp0xff9966bcREADofsize4at0xf5801344threadT0#00x8259411inboost::unit_test::framework::run(unsignedlong,bool)../common/lib/boost/bo

c++ - 为派生类专门化 std::hash 在 gcc 中工作,而不是 clang

我正在尝试为派生类专门化std::hash。目前最好的方法是基于thisanswer:#include#include#includenamespacefoo{templateusingfirst=T;structhashable{};structbar:publichashable{};}namespacestd{templatestructhash::value>>>{size_toperator()(constT&x)const{return13;}};}intmain(){std::unordered_setbaz;return0;}使用g++5.2.0编译时没有警告(-Wal

c++ - 强制使用预定义宏的 gcc 标志

我的问题如下。我正在尝试为mips构建一个项目。当我从它的存储库下载它时,构建它没有问题,但是当我将它作为一个更大项目的一部分构建它时,我收到以下错误:error:expected‘,’or‘...’beforenumericconstant我发现这是一个问题,因为某些变量称为mips,而同一变量在gcc编译器中被定义为预定义宏。#definemips1我验证了它:mipsel-linux-gnu-g++-dM-E-所以,我的问题是,是否有人知道是否有特定的编译器标志或其他什么强制使用此宏?奇怪的是,当我从存储库下载相同的代码时没有构建问题。这两个项目都是使用相同的工具链构建的,我已经

c++ - 使用 GCC 导出 C++ 类的符号

我正在使用dlopen合并动态加载库及其宿主的符号,在宿主中我有一个类:classFoo{public:Foo(){/*...*/}voidbar(){/*...*/}};intmain(){//Foofoo;return0;}我正在使用g++-Wl,--export-dynamic-otesttest.cpp编译它并使用nm-gtest检查符号。我希望符号_ZN3FooC1Ev和_ZN3FooC2Ev存在于可执行文件中,因为动态库需要它们,但除非我通过取消注释上面的行来使用它们,否则它们不会出现.我相信它正在被优化掉,因为GCC认为不需要它。如何强制将Foo的构造函数和方法包含在主机

c++ - 未定义对 clang 中函数指针的变量模板的引用,但不是 gcc

#includestaticconstexprboolisSSE2=true;templatestaticvoid(*fp)();templatestaticvoidfoo_c(){std::coutstaticvoidfoo_sse2(){std::cout=foo_sse2;elsefp=foo_c;fp();return0;}我有一个使用变量模板的项目,它本身就是一个指向函数的指针。上面的示例代码在GCC6.3中编译和执行良好,但在clang3.9.1中给出警告和错误。$clang++"Source.cpp"-o"foo.exe"-std=c++14-O2Source.cpp:6

c++ - 具有未触及的非 constexpr 参数 : Who is correct, clang 或 gcc 的 constexpr?

我有4个测试用例,我相信它们都是有效的:constexprintf(intconst&/*unused*/){return1;}voidg(intconst&p){constexprinta=f(p);//clangerror,gccvalidintv=0;constexprintb=f(v);//clangvalid,gccvalidintconst&r=v;constexprintc=f(r);//clangerror,gccerrorintn=p;constexprintd=f(n);//clangvalid,gccvalid}intmain(){intp=0;g(p);}Cla

c++ - flto 与 gcc7.2 崩溃

我在以下代码文件中遇到getline崩溃。我构建了gcc7.2,因为系统更新不可用。最小的例子:#includeintmain(intargc,char*argv[]){std::stringline;while(std::getline(std::cin,line)){}return0;}下面几行GCC_INSTALL_DIR代表我自己的gcc安装目录输出:./a.outa***Errorin`./a.out':free():invalidpointer:0x0000000000602200***=======Backtrace:=========/lib64/libc.so.6(+

c++ - 生成具有完整路径的 gcc 依赖项

我有一个看起来像这样的简单项目.├──build│  ├──file1.o│  └──one│  ├──file1.o│  └──file2.o├──.depend├──Makefile└──src  ├──file1.cpp  └──one  ├──file1.cpp  └──file2.cppMakefile是这样的:#GetallofthesourcefilesSRC=$(shellfindsrc/-name"*.cpp")#GetalloftheobjectfilesOBJ=$(substsrc,build,$(SRC:.cpp=.o))$(OBJ):@mkdir-p$(she

c++ - 为什么尽管使用了 -isystem,但 clang 在我的标题上报告了警告,而 gcc 没有报告?

与thisquestion稍微相关但不一样。在ArchLinux上使用clang7.0.1。我喜欢干净的代码,所以我想启用所有警告并将它们视为错误。问题是我的构建中有一些自动生成的文件不是没有警告,例如:生成/foo.hinlinevoidfoo(intunused){//warning:unusedparameter'unused'}生成/foo.cc#include"foo.h"//Thereisactualcodehere,butitdoesn'tmatter.由于这些文件是由第三方工具生成的,我不能轻易修改它们,所以我使用-isystem禁止来自generated的所有警告目录

c++ - gcc 与 clang : noexcept parsed in unused template specialization when static casting

我正在尝试将函数指针静态转换为特定函数重载,但似乎clang仍会解析(未使用的)模板特化的noexcept语句,从而生成编译器错误。如果未使用相应的函数重载,GCC似乎并不关心noexcept。templatevoidfun(T)noexcept(T(1)){}voidfun(int){}voidfun(int*){}intmain(){inta;fun(&a);//callingworksfinefun(a);static_cast(&fun);//staticcastingdoesn't}https://godbolt.org/z/ixpl3f这里是哪个编译器出错了?当将函数指针转