GCC / Clang -Wall -Wextra -Wshadow -Wnon-virtual-dtor -pedantic -Wall -Wextra 合理、标准 -Wshadow 如果变量声明覆盖了父上下文中的变量...警告有潜在性能问题的强制类型转换 -Wunused 警告任何未使用的东西 -Woverloaded-virtual 如果重载(而不是覆盖)虚函数,则发出警告 -Wpedantic 如果使用了非标准的C...++则发出警告(所有版本的GCC, Clang >= 3.2) -Wconversion 对可能丢失数据的类型转换发出警告 -Wsign-conversion 对影响到符号的类型转换发出警告(Clang...2 对输出格式化函数(即printf)的安全问题发出警告 -Wlifetime 显示对象生命周期问题(目前只有Clang的特殊分支) 考虑使用-Weverything,并且只在需要的情况下禁用少数警告。...通用 一开始就设置非常严格的警告,在项目开始后试图提高警告级别可能会很痛苦。 考虑使用将警告视为错误的设置,例如MSVC中的/Wx,以及GCC/Clang中的-Werror。
静态分析工具能够在代码未运行的情况下分析源代码,发现代码中的bug。在C/C++程序中,静态分析工具可以发现程序错误,如空指针取消引用、内存泄漏、被零除、整数溢出、越界访问、初始化前使用等。...Clang是一个优秀的静态分析器,能够分析代码中潜在的问题。对于上面的问题,GCC 在编译时加上-Wall 和-Wpedantic编译选项也可以分析出bug。...和GCC的主要任务是编译代码,静态分析也并不是在每次编译时都需要,而且编译器在做静态分析时需要花费大量的时间。...比如空指针,除零,整数溢出,无效的移位操作,无效的转换,STL的无效用法,内存管理,空指针引用,越界检查,未初始化的变量,未使用或者重复的代码等。...GCC编译代码,并没有报出任何警告和错误。
如何基于LLVM编译器来开发构建一个静态代码分析工具,检测常见的错误编码方式,深入浅出介绍如何通过编译器来检测持锁未释放的场景;最后是机器学习在低功耗设计中的应用展望,通过机器学习了解用户的行为,在应用开发中既满足用户体验...Clang和LLVM的纽带在于LLVMIR(Intermediate Representation),这也是LLVM的核心。...相对GCC来说Clange&LLVM学习曲线更平缓,并且它们使用的是BSD License,相比GPL更加优化;高度的模块化,比GCC更容易扩展和二次开发;另外它们有设计良好的接口和模式,便于访问内部数据...,如:访问抽象语法树(AST)节点、获取控制流图节点(CFG Node)、进行上下文符号获取等等;Clang对C++标准的支持更完整、更快;它们还有良好的GCC兼容性,包括GCC内置扩展语法、内置关键字的支持...;无论是编译速度、内存开销、部分平台上代码执行效率Clang和LLVM都超过了GCC。
3、Xcode编译器发展过程 Clang 是 LLVM 的子项目,是 C、C++ 和 Objective-C 编译器,目标是替代传统编译器 GCC 。...我们以 Xcode 为例,Clang 编译 Objective-C 代码的速度是 Xcode 5 版本前使用的 GCC 的3倍,其生成的 AST 所耗用掉的内存仅仅是 GCC 的五分之一左右。...4.2版本; Xcode5:GCC被废弃,新的编译器是LLVM 5.0,从GCC过渡到Clang-LLVM的时代正式完成,Objective-C与swift都采用Clang作为编译器前端 4、Clang-LLVM...由 Clang 中 Parser 和 Sema 配合完成。...静态分析(Static Analysis):静态分析会对代码进行错误检查,如出现方法被调用但是未定义、定义但是未使用的变量等,以此提高代码质量。
本着强迫症要消灭一切警告的做法,最终定位到:是结构体内部, 指向结构体类型的指针成员变量导致的问题。 这个问题,也许永远不会碰到,之所以被我赶上了,应该是因为某个时候手贱, 误碰了键盘导致。...PS: 我的测试环境是 Ubuntu16.04-64,编译器使用系统自带的 gcc-5.4.0。 二、问题描述 1....gcc 在遇到 struct _Data2_ 这个字符串时,判断出它是一个用户自定义的数据类型:结构体 _Data2。...以上代码,如果使用clang来编译,结果也是正确的。...不过,从中我们也看到了一个现象:gcc编译器在面对结构体时,主要关心的是结构体在内存空间中所占用的空间大小,对其内部指向结构体类型的指针,并没有严格的检查是否存在,g++ 在这一点就做的严谨一些了。
再来简单看看一些编译器的历史,GCC、LLVM以及Clang等,以及文章介绍的armcc 以及armclang。...苹果公司之前一直使用GCC作为编译器,但是GCC对Objective-C支持一直不怎么好,好多新特性没有增加,所以苹果公司开始寻求编译器的替代品。...死代码包括对程序结果没有影响的可达代码,例如对从未使用过的局部变量的赋值。无法访问的代码是专门的代码无法通过任何控制流路径访问,例如紧跟在返回之后的代码 陈述。 -O1受限优化。...编译器只执行可以描述为调试信息的优化。删除未使用的内联函数和未使用的静态函数。关掉严重降低调试视图的优化。如果与 –debug 一起使用,此选项会给出总体上令人满意的调试视图且具有良好的代码密度。...如果寄存器未声明为C或C++变量,编译器将生成警告 不得在内联程序集代码中保存和还原寄存器,编译器会执行此操作。此外,内联汇编程序不提供对物理寄存器的直接访问。
image.png emcc 用于从命令行调用Emscripten的编译器,它实际上是标准编译器gcc或者clang的一个替换。...emcc参数介绍 # 显示信息 emcc --help # 显示编译器版本信息 emcc --version 大部分clang或者gcc的选项(option)都是可以工作的。...如果只是编译到bitcode,那就和clang和gcc中的-g一样。 如果是要编译到JavaScript,-g就等于-g3。...-g3:保留变量名,与-g同。变量名一般不是必须编译后保留的,但是如果保留了,可以推断变量的目的,对吧。 -g4:保留llvm 调试信息,这是能调试的最高级别。...取值包括0和1. 0:不单独生成.mem文件。 1:单独生成.mem文件。 -Wwarn-absolute-paths 启用在-I和-L命令行指令中使用绝对路径的警告。
之前电脑没有换固态之前,用过一段时间的codeblocks,换了之后就一直用VS了。 这次换vscode的原因主要是因为最近看到CPP的一些细节的东西的时候发现VS会完全忽略掉这些错误和警告。...印象最深的是关于函数返回局部指针变量的处理: eg: char * fun() { char *p = "hello"; return p; } 这个函数输入到VS里面是完全没有警告和错误的...还有:return p;这个是有内存风险的,局部指针创建的对象在栈上,返回p的时候函数调用完毕,指针被赋值给其他全局变量的话,栈上空间就会被释放掉,所以这个也是有警告的。...重启之后,Win+r输入cmd打开命令行,分别输入gcc和clang后回车。 ? 出现如上所示的提示认为安装成功。 法2...."panel": "shared" // 不同的文件的编译信息共享一个终端面板 } // "problemMatcher":"$gcc" // 如果你不使用
protobuf 对 std::to_string 的使用和交叉编译适配 protobuf 从 v3.14.0 版本开始依赖 C++11,直接使用了。...所使用的 protobuf v3.13.0 里对关闭 protoc 和单元测试以后,开启 libprotoc 也没有支持,所以也需要Patch一下。...这样可以最大限度地共享已有的编译缓存;另外优化了一些重置cmake会用到的环境变量的脚本。因为有些构建流程会通过设置环境变量来影响构建选项。 gRPC 对新版本的编译器适配也有一些问题。...GCC/Clang STL BUG 在适配 gRPC 的过程中,我还碰到了一个GCC和Clang的BUG。...我只在GCC上碰到了,但是按 stackoverflow 上的相关问题的说法Clang也是有问题的。我本地的Clang版本都比较高,在高版本的Clang上是没有这个问题的。
.data:存放的是初始值不为零的一些可读写变量。 .bss:存放的是初始值为零或未初始化的一些可读写变量。该 section 仅指示运行时需要的内存大小,不会占用 so 文件的体积。...和 hidden: default:除非对变量或函数特别指定符号可见性,所有符号都在动态符号表中,这也是不使用 -fvisibility 时的默认值。...GCC 和 Clang 均支持 LTO。...Clang 和 GCC 均提供了 Os 的优化级别,其与 O2 比较接近,但是优化了生成产物的体积。而 Clang 还提供了 Oz 优化级别,在 Os 的基础上能进一步优化产物体积。...Oz/Os 优化相比于 O3 优化,优化了产物体积,性能上可能有一定损失,因此如果项目原本使用了 O3 优化,可根据实际测试结果以及对性能的要求,决定是否使用 Os/Oz 优化级别,如果项目原本未使用
SciPy >= 0.14 当前只有稀疏矩阵和特殊功能需要,但强烈推荐。SciPy > = 0.8可以工作,但早期版本对稀疏矩阵有已知的错误。...安装和配置GPU驱动程序(推荐) 警告 现在OpenCL仍然是最小支持。 安装CUDA驱动程序 按照此链接安装CUDA驱动程序和CUDA工具包。 你必须在驱动程序安装后重新启动计算机。...注意 对于MacOS你应该能够按照上面的说明来设置CUDA,但要注意以下警告: 如果您想要编译CUDA SDK代码,您可能需要暂时还原为Apple的gcc(sudo 端口 选择 gcc)作为它们的Makefile...安装和配置GPU驱动程序(推荐) 警告 现在OpenCL仍然是最小支持。 安装CUDA驱动程序 按照此链接安装CUDA驱动程序和CUDA工具包。 你必须在驱动程序安装后重新启动计算机。...注意 对于MacOS你应该能够按照上面的说明来设置CUDA,但要注意以下警告: 如果您想要编译CUDA SDK代码,您可能需要暂时还原为Apple的gcc(sudo 端口 选择 gcc)作为它们的Makefile
ASan介绍 ASan全称AddressSanitizer,是一种内存错误检测工具,目的是帮助开发者检测和调试内存相关的问题,如使用未分配的内存、使用已释放的内存、堆内存溢出等。...ASan使用 要使用ASan,你需要使用支持ASan的编译器,如Clang或GCC,并开启ASan相关的编译选项。...使用Clang编译器,在终端执行以下命令: clang -fsanitize=address -g your_program.c -o your_program 使用GCC编译器,在终端执行以下命令:...-g选项用于生成调试符号,以支持调试和定位错误。当然,我们也可以通过环境变量的方式加入ASan编译选项,然后编译额时候需要加上环境变量,一般是CFLAGS或者CXXFLAGS。...以下是一些常用的 AddressSanitizer 编译选项及其作用: Memory Sanitizer (-fsanitize=memory):用于检测对未初始化内存或使用已释放内存的操作。
本文均在CentOS7(release 7.6.1810)版本下进行过的测试 我推荐使用Clang3.4.2的编译方法。...编译器的选择 使用GCC编译器 最新的Rosetta代码编译依赖完整的C++11特性,因此我们需要更新系统自带的gcc编译器。...clang3.4完全兼容C++11 regex。推荐使用!并且更加灵活和快速。.../openmpi_clang/bin/mpirun /usr/local/bin/mpiclang 运行时应该使用mpiclang,而不是mpirun(gcc),避免影响其他gcc编译软件的并行。.../scons.py -j 40 mode=release bin extras=mpi #gcc # 使用clang编译:export PATH=/usr/local/openmpi_clang/bin
不过,我们看到的是汇编程序,AST 和 Compiler Explorer 的输出并不是我写代码的语言,因此我对这些输出并不熟悉。...于是,我开始着手编写一个基于 Clang 的工具,可将基于范围的 for 循环转换为编译器内部版本。接着,我对结构化绑定和 lambda 也做了同样的处理。最终,我的工作超出了最初计划。...C++ Insights 这个工具显示了运算符的调用位置,以及编译器进行类型转换的情况,可以推断出 auto 或 decltype 背后的类型。...请记住,C++ Insights 是基于 Clang 及其对 AST 的理解而建立的。 3、如何构建? C++ Insights 可以在 Clang 源代码树内部或外部进行构建。.../scripts/getinclude.py` 自定义 GCC 安装 如果你用的是自定义版本的 GCC 编译器,例如 gcc-11.2.0,且未安装在编译器的默认系统路径中,那么在构建后,Clang 将无法找到正确的
项目源码 官方文档 新特性介绍 工具链改进 工具链和平台完全分离 之前的版本,平台和工具链绑定的过于紧密,例如xmake f -p windows 平台,默认只能使用msvc的编译,想要切到clang...$ xmake f -p windows --toolchain=clang 内置工具链 虽然xmake的交叉编译配置支持所有工具链,也提供一定程度的智能分析和工具链探测,但通用方案多少对特定工具链支持需要追加各种额外的配置...这也是推荐做法,因为像gcc/clang等大部分编译工具链,编译器和链接器都是配套使用的,要切就得整体切,单独零散的切换设置会很繁琐。...设置构建行为策略 xmake有很多的默认行为,比如:自动检测和映射flags、跨target并行构建等,虽然提供了一定的智能化处理,但重口难调,不一定满足所有的用户的使用习惯和需求。...基于gcc flags的普及性,xmake采用gcc的flags命名规范,对其根据不同的编译实现自动映射,例如: add_cxflags("-O0") 这一行设置,在gcc/clang下还是-O0,但如果当前是
编写的插件的支持 [ ] –enable-pythoninterp:打开对python编写的插件的支持 [ ] –enable-python3interp:打开对python3编写的插件的支持 [...] –enable-luainterp:打开对lua编写的插件的支持 [ ] –enable-perlinterp:打开对perl编写的插件的支持 [ ] –enable-multibyte:打开多字节支持...` 用以更新或使用 :PluginUpdate:PluginSearch foo - 搜索 foo ; 追加 `!` 清除本地缓存 :PluginClean - 清除未使用插件,需要确认; 追加 `!...` 自动批准移除未使用插件 :h vundle 获取更多细节和wiki以及FAQ 或者通过以下快速安装: vim +PluginInstall +qall 附加 增加clang:添加C语言家族语法补全功能.../install.py --clang-completer 可能出现的问题: The ycmd server SHUT DOWN (restart with ':YcmRestartServer').
二,g++和gcc的区别 gcc可以判断出目标程序所使用编程语言的类别,会把xxx.c文件当作C语言编译,把xxx.cpp文件当作C++语言编译。...当正在编译的C++代码文件依赖STL标准库的时候,为了使用STL,gcc命令需要增加参数–lstdc++。因此,虽然gcc和g++都可以编译C++语言程序,但是使用g++会更方便一些。...静态库链接时,搜索库文件路径的顺序: 1. ld会去找GCC命令中的参数-L 2. gcc的环境变量LIBRARY_PATH 3....macro" -undef #取消对任何非标准宏的定义 警告与报错参数 -Wall #发出gcc提供的所有有用的报警信息 -Werror #将警告升级为编译报错 -Wextra / -W #启用...-Wall未启用的额外警告位,对合法但值得怀疑的代码发出警告 例如 -Wsign-compare -pendantic / -Wpendantic #发出ISO C和ISO C++标准列出的所有警告
解决方案 3.1、加一个void参数 3.2、全部忽略 4、未被使用的变量 Unused variable ‘xxxx’ 减少此类Warning有利于节省内存 5、指针未添加nullable标识...和?来表示一个对象是optional的还是non-optional,如view?和view!。...解决方案 10.1、重新编译库与项目编译版本匹配 10.2、Build Settions Other links Flags 中添加-w忽略掉 二、通过Clang来忽略警告 1、忽略一段代码的警告...#pragma clang diagnostic push #pragma clang diagnostic ignored "-Wimplicit-retain-self" // 要忽略警告的代码...#pragma clang diagnostic pop 常用的忽略警告类型 字段 警告类型 -Wimplicit-retain-self 循环引用 -Wstrict-prototypes 不带参数的
关于编译器预定义的Log以及它们的一些实现机制,感兴趣的同学可以移步到gcc文档的PreDefine页面和clang的Builtin Macro进行查看。...你可以在其中填写任意多的-W...以开关某些警告,比如,填写为-Wall -Wno-unused-variable即可打开“全部”警告(其实并不是全部,只是一大部分严重警告而已),但是不启用“未使用变量...虽然苹果现在用的都是LLVM了,但是这部分内容应该是继承了GCC的设定。 控制警告,局部加入或关闭 Clang提供了我们自己加入警告或者暂时关闭警告的办法。...ignored "-Wunused-variable" int a; #pragma clang diagnostic pop 如果a之后没有被使用,也不会出未使用变量的警告了。..."clang的参数" #pragma clang diagnostic pop 自行Clang使用手册: http://clang.llvm.org/get_started.html #pragma非常复杂需要你对编译器底层非常的了解
本文希望介绍一个特殊的 预处理指令 #pragma clang poison ,该指令可以实现禁止调用 performSelector: 方法的诉求 performSelector: `performSelector...:aSelector]; 这种用法同样存在很多风险,比如,可能会出现内存泄露,可能因未做好参数校验导致崩溃。...所以,很多 APP 都希望严格控制项目对 performSelector: 的使用入口,避免随意的调用 performSelector: 产生崩溃 #pragma GCC poison `#pragma...GCC poison`[2] 是 GCC 编译器支持的一个预处理指令,可以用于移除程序中的**identifier(标识符)** 比如,#pragma GCC poison NSLog 可以让源码出现...image-20210221224422395 clang 编译器同样支持这种写法,同时也支持将 GCC 替换成clang 所以,我们可以使用下面的预处理指令 #pragma clang poison
领取专属 10元无门槛券
手把手带您无忧上云