首页
导航
博客
电子书
算法
众创
代码
随贴
关于我们
您好,欢迎来到码863代码分享网! 请
[登录]
/
[注册]
搜 索
标题:
*
140
字
TAG标签:
(用空格隔开)
30
字
恢复历史版本:
请选择分类
html
python
javascript
php
sql
c
c++
c#
java
plain
所有人可见
仅自己可见
编辑器:UEditor
编辑器:TinyMCE
编辑器:Editor.md
HTML转MD
HTML转MD2
##重要资料导航 GCC编译器官方文档:[https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gcc/](https://gcc.gnu.org/onlinedocs/gcc-13.2.0/gcc/) [编译过程: https://blog.csdn.net/dingxiaoxv/article/details/126908555](https://blog.csdn.net/dingxiaoxv/article/details/126908555 "编译过程") ##gcc与nasm编译32位c+nasm汇编 ``` [BITS 32] ; 3制作32位模式用的机器语言 GLOBAL _io_hlt [SECTION .text] _io_hlt: ; void io_hlt(void); HLT RET ``` nasm -f elf32 a.asm -o a.o ```c #include <stdio.h> void _io_hlt(void); void HariMain(void) { for (;;) { _io_hlt(); } } ``` gcc -c -m32 -O0 -std=c89 5.c -o 5.o ld -m elf_i386 -e=0x100000 -Ttext=0x100000 --oformat binary -o 5.bin 5.o a.o ndisasm -b 32 -o 0x100000 5.bin >> 55.asm objdump -D -b binary -m i386 5.bin ld -e=入口 -Ttext=起初地址 ##C编译成引导过程   ```c int func() { int i=0; i++; return 0; } ``` 系统不同生成.s文件的结构与精简度不同,win10下生成的最精简 gcc -S -m32 -O0 -ansi 1.c ``` .file "1.c" .text .globl _func .def _func; .scl 2; .type 32; .endef _func: pushl %ebp movl %esp, %ebp subl $16, %esp movl $0, -4(%ebp) addl $1, -4(%ebp) movl $0, %eax leave ret ``` 把函数与引导结合后再编译成.bin ##gcc编译成at转nasm >先在win10下编译成1.s生成得最精简,把1.s修改下格式,生成.bin,再利用ndisasm反编译成nasm ```c int func(int i) { return ++i; } ``` > gcc -S -m32 -O0 -std=c89 1.c ;win10下编译后,改下格式 ``` .code16 .section .text .globl _start _start: _func: pushl %ebp movl %esp, %ebp addl $1, 8(%ebp) movl 8(%ebp), %eax popl %ebp ret ``` > 下面用linux编译 as -o 1.o 1.s ld -Ttext=0x7c00 --oformat binary -o 1.bin 1.o ndisasm -o 0x7C00 1.bin >> 1.asm ##GCC编译成AT@T汇编语言 GCC 5.2.0(以及可能的早期版本)支持使用该-m16标志生成16位代码.但是,代码几乎肯定会依赖于32位处理器功能(例如32位宽的寄存器),-m16选项与-m32相同,除了它在汇编输出的开头输出".code16gcc"汇编指令,以便二进制可以在16位模式下运行. - 编译成AT@T汇编语言: gcc -S 1.c -o 1.s gcc -S 1.c gcc -S -m32 1.c ;-m32编译成32位,默认64位 gcc -S -m32 -O0 3.c ;0优化 gcc -S -m32 -O0 -ansi 3.c ;ANSI标准 禁止GNU C某些特色 gcc -S -m32 -O0 -std=c99 3.c ;c99标准 禁止GNU C某些特色 ##AT@T编译成BIN(linux下) ``` 在linux下编译 as -o 1.o 1.s ld -Ttext=0x7c00 --oformat binary -o 1.bin 1.o 或as --32 -march=i386 -o 1.o 1.s ld -m elf_i386 -Ttext=0x7c00 --oformat binary -o 1.bin 1.o ``` ``` ;1.s 引导程序 .code16 .section .text .globl _start _start: movw %cs, %ax movw %ax, %ds movw %ax, %es call DispStr loop1: jmp loop1 DispStr: movw $BootMessage, %ax movw %ax, %bp movw $0x10, %cx movw $0x1301, %ax movw $0xc, %bx movb $0, %dl int $0x10 ret BootMessage: .ascii "Hello, MN world!" .org 510 .word 0xAA55 ``` ##ndisasm反编译 ndisasm -o 0x7C00 boot.bin >> disboot.asm ##objdump ###objdump反编译 先用gcc编译成.o,再反编译 gcc -c -g -o mytest mytest.c objdump -j .text -S 1.o ;反汇编mytest中的text段内容,并尽可能用源代码形式表示 objdump -S 1.o ;反汇编出mytest.o的源代码: objdump -V ;查看当前使用的objdump的版本号 objdump -i ;显示可用的架构和目标结构列表 objdump --section=.text -s mytest ;显示mytest文件中的text段的内容 objdump -t 1.o ;显示文件的符号表入口 objdump -t -C 1.o ;显示文件的符号表入口,将底层符号解码并表示成用户级别 objdump -d 1.o ;反汇编目标文件的特定机器码段 objdump -h 1.o ;显示目标文件各个段的头部摘要信息 objdump -t -C 1.o ;显示文件的符号表入口,将底层符号解码并表示成用户级别 objdump -t -C 1.o ;显示文件的符号表入口,将底层符号解码并表示成用户级别 ###objdump所有选项 | | | | | ------------ | ------------ | ------------ | |—archive-headers|-a|显示档案库的成员信息,类似ls -l将lib*.a的信息列出。| |-b bfdname|—target=bfdname|指定目标码格式。这不是必须的,objdump能自动识别许多格式,比如<br>objdump -b oasys -m vax -h fu.o<br>显示fu.o的头部摘要信息,明确指出该文件是Vax系统下用Oasys编译器生成的目标文件。objdump -i将给出这里可以指定的目标码格式列表。| |—demangle|-C|将底层的符号名解码成用户级名字,除了去掉所开头的下划线之外,还使得C++函数名以可理解的方式显示出来。| |-g|--debugging|显示调试信息。企图解析保存在文件中的调试信息并以C语言的语法显示出来。仅仅支持某些类型的调试信息。有些其他的格式被readelf -w支持。| |-e|--debugging-tags|类似-g选项,但是生成的信息是和ctags工具相兼容的格式。| |-d|--disassemble|从objfile中反汇编那些特定指令机器码的section。| |-D|--disassemble-all|与 -d 类似,但反汇编所有section.| |-EB / -EL|--endian={big/little}|指定目标文件的小端。这个项将影响反汇编出来的指令。在反汇编的文件没描述小端信息的时候用。例如S-records.| |-f|—file-headers|显示objfile中每个文件的整体头部摘要信息。| |-h|—section-headers / —headers|显示目标文件各个section的头部摘要信息。| |-H|—help|简短的帮助信息。| |-i|—info|显示对于 -b 或者 -m 选项可用的架构和目标格式列表。| |-j name|—section=name|仅仅显示指定名称为name的section的信息| |-l|—line-numbers|用文件名和行号标注相应的目标代码,仅仅和-d、-D或者-r一起使用使用-ld和使用-d的区别不是很大,在源码级调试的时候有用,要求编译时使用了-g之类的调试编译选项。| |-m machine|—architecture=machine|指定反汇编目标文件时使用的架构,当待反汇编文件本身没描述架构信息的时候(比如S-records),这个选项很有用。可以用-i选项列出这里能够指定的架构.| |—reloc|-r|显示文件的重定位入口。如果和-d或者-D一起使用,重定位部分以反汇编后的格式显示出来。| |—dynamic-reloc|-R|显示文件的动态重定位入口,仅仅对于动态目标文件意义,比如某些共享库。| |-s|—full-contents|显示指定section的完整内容。默认所有的非空section都会被显示。| |-S|—source|尽可能反汇编出源代码,尤其当编译的时候指定了-g这种调试参数时,效果比较明显。隐含了-d参数。| ||—show-raw-insn|反汇编的时候,显示每条汇编指令对应的机器码,如不指定—prefix-addresses,这将是缺省选项。| ||—no-show-raw-insn|反汇编时,不显示汇编指令的机器码,如不指定—prefix-addresses,这将是缺省选项。| ||—start-address=address|从指定地址开始显示数据,该选项影响-d、-r和-s选项的输出。| ||—stop-address=address|显示数据直到指定地址为止,该项影响-d、-r和-s选项的输出。| |-t|—syms|显示文件的符号表入口。类似于nm -s提供的信息| |-T|—dynamic-syms|显示文件的动态符号表入口,仅仅对动态目标文件意义,比如某些共享库。它显示的信息类似于 nm -D/—dynamic 显示的信息。| |-V|—version|版本信息| |—all-headers|-x|显示所可用的头信息,包括符号表、重定位入口。-x 等价于-a -f -h -r -t 同时指定。| |-z|—disassemble-zeroes|一般反汇编输出将省略大块的零,该选项使得这些零块也被反汇编。| |@file|@file|可以将选项集中到一个文件中,然后使用这个@file选项载入。| ##GCC和NASM联合编译 GCC不用说,C语言的编译器。NASM是一个x86的汇编器,用来编译汇编的。 环境debian11.6 gcc version 10.2.1 NASM version 2.15.05 sudo apt-get update sudo apt-get install gcc gcc-multilib nasm 安装gcc gcc64位库 nasm 1.建立示例 test.c hello.asm nasm -f elf64 hello.asm -o hello.o gcc -o test.exe test.c hello.o 其中nasm的参数 -f elf64表示输出文件的格式为ELF64位格式 。 2.NASM和C互相调用对方的函数 先看例子的代码: ``` extern print_helloworld [section .text] global print_two_hello_world print_two_hello_world: call print_helloworld call print_helloworld ``` ```c #include "stdio.h" extern void print_two_hello_world(); char *strhello = "Hello,world!\n"; void print_helloworld() { printf ("%s",strhello); } int main() { print_two_hello_world(); return 0; } ``` 3.NASM和C互相调用对方的变量 同样先看代码: hello.asm ``` global iam extern hello [section .data] iam: db 'I am Chinese.',0x0A,0x0 [section .text] global print_hello global cpy_mem print_hello: mov edx, 13 mov ecx,[hello] mov ebx,1 mov eax,4 int 0x80 ``` test.c ```c #include "stdio.h" extern char *iam; extern void print_hello(); //extern cpy_mem(void *dest, int len); char *hello = "Hello,world!\n"; int main() { printf("%x\n",&iam); printf("%s", &iam); print_hello(); return 0; } ``` 执行结果如下:  具体的代码内容就部分析了,这里主要将两个关键的地方。 1.hello=0xa00001,而&hello=0xb00001,在C中定义了一个hello的字符串指针,在C语言中hello的值是0xa00001表示字符串的首地址,而hello指针f的地址是4字节地址为0xb00001,但到了NASM中则表示的hello变量的首地址了0xb00001,所以 mov ecx,[hello] 代码中加了中括号表示是内容,即0xa00001,相当于c中的*hello 2.第二点要注意的是,在NASM中定义了一个字符串iam,在C语言中导入的话,就是表示字符串的首地址,因此要引用该字符串一定要取其地址,不要直接转为(char*)类型直接用,否则出错,这是因为直接转的话,就将字符串的前4个字节转成了字符串指针,但该指针是不确定会出现段错误! ##GCC编译命令的常用选项 | 选项 | 解释 | | ------------ | ------------ | |-ansi|只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色, 例如 asm 或 typeof 关键词。| |-DMACRO|以字符串"1"定义 MACRO 宏。| |-DMACRO=DEFN|以字符串"DEFN"定义 MACRO 宏。| |-g|生成调试信息。GNU 调试器可利用该信息。| |-ggdb|此选项将尽可能的生成 gdb 的可以使用的调试信息。| |-gstabs|此选项以stabs格式声称调试信息,但是不包括gdb调试信息。| |-gstabs+|此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息。| |-IDIRECTORY|指定额外的头文件搜索路径DIRECTORY。| |-LDIRECTORY|制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个DIRECTORY就是目录的名称。| |-lLIBRARY|连接时搜索指定的函数库LIBRARY。| |-static|此选项将禁止使用动态库,所以,编译出来的东西,一般都很大,也不需要什么动态连接库,就可以运行。| |-share|此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库。| |-o <文件>|生成指定的输出文件。用在生成可执行文件时。| |-O0|不进行优化处理。| |-O 或 -O1|优化生成代码。| |-O2|进一步优化。| |-O3|比 -O2 更进一步优化,包括 inline 函数。| |-shared|生成共享目标文件。通常用在建立共享库时。| |-static|禁止使用共享连接。| |-UMACRO|取消对 MACRO 宏的定义。| |-w|不生成任何警告信息。| |-Wall|生成所有警告信息。| |-pass-exit-codes|以最高错误代码退出某个阶段。| |--help|显示此信息。| |--target-help|显示目标特定的命令行选项。| |--help=`{common|optimizers| |--version|显示编译器版本信息。| |-dumpspecs|显示所有内置规格字符串。| |-dumpversion|显示编译器的版本。| |-dumpmachine|显示编译器的目标处理器。| |-print-search-dirs|显示编译器搜索路径中的目录。| |-print-libgcc-file-name|显示编译器配套库的名称。| |-print-file-name=|显示库的完整路径。| |-print-prog-name=|显示编译器组件的完整路径。| |-print-multiarch|显示目标的规范化 GNU 三元组,用作库路径中的组件。| |-print-multi-directory|显示 libgcc 版本的根目录。| |-print-multi-lib|显示命令行选项与多个库搜索目录。| |-print-multi-os-directory|显示操作系统库的相对路径。| |-print-sysroot|显示目标库目录。| |-print-sysroot-headers-suffix|显示用于查找标头的 sysroot 后缀。| |-Wa,<选项>|将逗号分隔的 <选项> 传递给汇编器。| |-Wp,<选项>|将逗号分隔的 <选项> 传递到预处理器。| |-Wl,<选项>|将逗号分隔的 <选项> 传递给链接器。| |-Xassembler|将传递给汇编器。| |-Xpreprocessor|将传递给预处理器。| |-Xlinker|将传递给链接器。| |-save-temps|不要删除中间文件。| |-save-temps=|不删除中间文件。| |-no-canonical-prefixes|构建相对路径时不要规范化路径其他 gcc 组件的前缀。| |-pipe|使用管道而不是中间文件。| |-time|每个子进程的执行时间。| |-specs=<文件>|使用 <文件> 的内容覆盖内置规范。| |-std=<标准>|假设输入源适用于<标准>。| |--sysroot=|使用作为标头的根目录和库路径。| |-B <目录>|将<目录> 添加到编译器的搜索路径。| |-v|显示编译器调用的程序。| |-###|与 -v 类似,但引用了选项并且不执行命令。| |-E|仅预处理; 不要编译、汇编或链接。| |-S|只编译; 不要组装或链接。| |-c|编译和汇编,但不链接。| |-pie|创建动态链接位置独立可执行的。| |-shared|创建共享库。| |-x <语言>|指定以下输入文件的语言。‹br›允许的语言包括: c c++ 汇编语言 none。'none' 表示恢复为默认行为根据文件扩展名猜测语言。| |-include file|包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用 **#include**。| |-imacros file|将 file 文件的宏, 扩展到 gcc/g++ 的输入文件, 宏定义本身并不出现在输入文件中。| |-traditional|试图让编译器支持传统的C语言特性。| |-funsigned-char‹br›-fno-signed-char‹br›-fsigned-char‹br›-fno-unsigned-char|对char类型进行设置,决定将char类型设置成‹br›unsigned char(前两个参数)‹br›signed char(后两个参数)| ##GCC警告选项 | 警告选项 | 含义 | | --- | --- | | \--all-warnings | 与-Wall 相同。 请改用后一个选项。 | | \--extra-warnings | 与-Wextra 相同。 请改用后一个选项。 | | \-W | 该开关已弃用; 使用 -Wextra 代替。 与-Wextra 相同。 | | \-Wabi | 警告使用符合 ABI 的编译器进行编译时将会发生的变化。 | | \-Wabi-tag | 如果子对象具有完整对象类型没有的 abi\_tag 属性,则发出警告。 | | \-Wabi= | 警告当前 -fabi-version 和指定版本之间发生的变化。 | | \-Wabsolute-value | 对计算绝对值的标准函数的可疑调用发出警告。 | | \-Waddress | 警告内存地址的可疑使用。 | | \-Waddress-of-packed-member | 当获取结构或联合的打包成员的地址时发出警告。 | | \-Waggregate-return | 关于返回结构、联合或数组的警告。 | | \-Waggressive-loop-optimizations | 如果迭代次数恒定的循环触发未定义的行为,则发出警告。 | | \-Waliasing | 警告虚拟参数可能存在别名。 | | \-Walign-commons | 警告 COMMON 块的对齐情况。 | | \-Waligned-new=\`\[none | global | | \-Wall | 启用大多数警告消息。 | | \-Walloc-size-larger-than= | \-Walloc-size-larger-than=‹字节› 对尝试分配大于指定字节数的对象的分配函数的调用发出警告。 | | \-Walloc-zero | \-Walloc-zero 对指定零字节的分配函数的调用发出警告。 | | \-Walloca | 警告任何使用 alloca 的情况。 | | \-Walloca-larger-than= | 对 alloca 的无限制使用以及其边界可能大于字节的 alloca 有限制使用发出警告。 | | \-Wampersand | 警告连续字符常量中缺少 & 符号。 | | \-Wargument-mismatch | 警告参数和参数之间的类型和等级不匹配。 | | \-Warray-bounds | 如果越界访问数组,则发出警告。 | | \-Warray-bounds=‹0,2› | 如果越界访问数组,则发出警告。 | | \-Warray-temporaries | 警告创建临时数组。 | | \-Wassign-intercept | 每当垃圾收集器拦截 Objective-C 分配时发出警告。 | | \-Wattribute-alias | 警告具有别名属性的声明中的类型安全以及类似错误和不匹配。 与 -Wattribute-alias= 相同。 | | \-Wattribute-alias=‹0,2› | 警告具有别名属性的声明中的类型安全以及类似错误和不匹配。 | | \-Wattribute-warning | 警告有关`__attribute__((warning))`声明的使用。 | | \-Wattributes | 警告属性使用不当。 | | \-Wbad-function-cast | 警告将函数转换为不兼容的类型。 | | \-Wbool-compare | 警告布尔表达式与不同于 true/false 的整数值进行比较。 | | \-Wbool-operation | 对布尔表达式的某些操作发出警告。 | | \-Wbuiltin-declaration-mismatch | 当使用错误签名声明内置函数时发出警告。 | | \-Wbuiltin-macro-redefine | 当内置预处理器宏未定义或重新定义时发出警告。 | | \-Wc++-compat | 警告不属于 C 和 C++ 公共子集的 C 构造。 | | \-Wc++0x-compat | 与 -Wc++11-compat 相同。 请改用后一个选项。 | | \-Wc++11-compat | 对 ISO C++ 1998 和 ISO C++ 2011 之间含义不同的 C++ 结构发出警告。 | | \-Wc++14-compat | 对 ISO C++ 2011 和 ISO C++ 2014 之间含义不同的 C++ 结构发出警告。 | | \-Wc++17-compat | 对 ISO C++ 2014 和 ISO C++ 2017 之间含义不同的 C++ 结构发出警告。 | | \-Wc++1z-compat | 与 -Wc++17-compat 相同。 请改用后一个选项。 | | \-Wc-binding-type | 如果变量的类型可能无法与 C 互操作,则发出警告。 | | \-Wc11-c2x-compat | 警告 ISO C11 中不存在但 ISO C2X 中存在的功能。 | | \-Wc90-c99-compat | 警告 ISO C90 中不存在但 ISO C99 中存在的功能。 | | \-Wc99-c11-compat | 警告 ISO C99 中不存在但 ISO C11 中存在的功能。 | | \-Wcannot-profile | 当请求分析工具但无法应用于特定功能时发出警告。 | | \-Wcast-align | 警告有关增加对齐的指针转换。 | | \-Wcast-align=strict | 警告有关增加对齐的指针转换。 | | \-Wcast-function-type | 警告不兼容函数类型之间的转换。 | | \-Wcast-qual | 警告丢弃限定符的强制转换。 | | \-Wcast-result | 警告将产生空结果的强制转换。 | | \-Wcatch-value | 对非引用类型的 catch 处理程序发出警告。 与 -Wcatch-value= 相同。 | | \-Wcatch-value=‹0,3› | 警告非引用类型的 catch 处理程序。 | | \-Wchar-subscripts | 警告类型为“char”的下标。 | | \-Wcharacter-truncation | 对截断的字符表达式发出警告。 | | \-Wchkp | 在 GCC 9 中已弃用。此开关无效。 | | \-Wclass-conversion | 当转换函数由于转换为的类型而永远不会被调用时发出警告。 | | \-Wclass-memaccess | 警告对类类型对象的不安全原始内存写入。 | | \-Wclobbered | 警告可能被“longjmp”或“vfork”更改的变量。 | | \-Wcomment | 对可能嵌套的块注释和跨越多个物理行的 C++ 注释发出警告。 | | \-Wcomments | \-Wcomment 的同义词。 与 -Wcomment 相同。 | | \-Wcompare-reals | 警告涉及 REAL 或 COMPLEX 表达式的相等比较。 | | \-Wconditionally-supported | 警告有条件支持的构造。 | | \-Wconversion | 警告可能更改值的隐式类型转换。 | | \-Wconversion-extra | 对大多数隐式转换发出警告。 | | \-Wconversion-null | 警告将 NULL 从非指针类型转换为非指针类型。 | | \-Wcoverage-mismatch 如果 | \-fprofile-use 中的配置文件不匹配,则发出警告。 | | \-Wcpp | 遇到 #warning 指令时发出警告。 | | \-Wctor-dtor-privacy | 当所有构造函数和析构函数都是私有的时发出警告。 | | \-Wdangling-else | 警告有关 dangling else 的情况。 | | \-Wdate-time | 警告 `__TIME__`、`__DATE__` 和 `__TIMESTAMP__` 使用情况。 | | \-Wdeclaration-after-statement | 在语句后发现声明时发出警告。 | | \-Wdelete-incomplete | 删除指向不完整类型的指针时发出警告。 | | \-Wdelete-non-virtual-dtor | 警告使用非虚拟析构函数删除多态对象。 | | \-Wdeprecated | 如果使用了已弃用的编译器功能、类、方法或字段,则发出警告。 | | \-Wdeprecated-copy | 如果类具有用户提供的复制操作,则将隐式声明的复制操作标记为已弃用。 | | \-Wdeprecated-copy-dtor | 如果类具有用户提供的复制操作或析构函数,则将隐式声明的复制操作标记为已弃用。 | | \-Wdeprecated-declarations | 警告使用 `__attribute__((deprecated))` 声明。 | | \-Wdesignated-init | 警告需要指定初始化器的结构的位置初始化。 | | \-Wdisabled-optimization | 当优化过程被禁用时发出警告。 | | \-Wdiscarded-array-qualifiers | 如果作为指针目标的数组上的限定符被丢弃,则发出警告。 | | \-Wdiscarded-qualifiers | 如果指针上的类型限定符被丢弃,则发出警告。 | | \-Wdiv-byzero | 警告编译时整数除以零。 | | \-Wdo-subscript | 警告 do 循环中可能存在不正确的下标。 | | \-Wdouble-promotion | 警告从“float”到“double”的隐式转换。 | | \-Wduplicate-decl-specifier | 当声明具有重复的 const、易失性、限制或 \_Atomic 说明符时发出警告。 | | \-Wduplicated-branches | 警告 if-else 语句中的重复分支。 | | \-Wduplicated-cond | 警告 if-else-if 链中的重复条件。 | | \-Weffc++ | 警告违反有效 C++ 风格规则的情况。 | | \-Wempty-body | 警告 if 或 else 语句中的主体为空。 | | \-Wendif-labels | 警告 #else 和 #endif 之后的杂散标记。 | | \-Wenum-compare | 警告不同枚举类型的比较。 | | \-Werror-implicit-function-declaration | 此开关已弃用; 请改用 -Werror=implicit-function-declaration 。 与-Werror | | \-Wexpansion-to-define | 如果在#if 之外使用“define”,则发出警告。 | | \-Wextra | 打印额外的(可能不需要的)警告。 | | \-Wextra-semi | 警告类内函数定义后的分号。 | | \-Wfloat-conversion | 对导致浮点精度丢失的隐式类型转换发出警告。 | | \-Wfloat-equal | 如果测试浮点数是否相等则发出警告。 | | \-Wformat | 警告 printf/scanf/strftime/strfmon 格式字符串异常。 与-Wformat=相同。 | | \-Wformat-contains-nul | 警告包含 NUL 字节的格式字符串。 | | \-Wformat-extra-args | 如果向函数的格式字符串传递太多参数,则发出警告。 | | \-Wformat-nonliteral | 警告非文字的格式字符串。 | | \-Wformat-overflow‹0,2› | 警告使用超出目标区域末尾的格式字符串的函数调用。 与 -Wformat-overflow=1 相同。 与-Wformat-相同 | | \-Wformat-overflow=‹0,2› | 警告使用超出目标区域末尾的格式字符串的函数调用。 | | \-Wformat-security | 警告格式函数可能存在的安全问题。 | | \-Wformat-signedness | 警告格式函数的符号差异。 | | \-Wformat-truncation | 警告调用 snprintf 和截断输出的类似函数。 与 -Wformat-truncation=1 相同。 与 -Wformat-truncati | | \-Wformat-truncation=‹0,2› | 对 snprintf 和截断输出的类似函数的调用发出警告。 | | \-Wformat-y2k | 警告 strftime 格式会产生 2 位数年份。 | | \-Wformat-zero-length | 警告零长度格式。 | | \-Wformat=‹0,2› | 警告 printf/scanf/strftime/strfmon 格式字符串异常。 | | \-Wframe-address | 当不安全地使用 `__builtin_frame_address` 或 `__builtin_return_address` 时发出警告。 | | \-Wframe-larger-than=‹字节大小› | 如果函数的堆栈帧需要超过‹字节大小›,则发出警告。 | | \-Wfree-nonheap-object | 尝试释放非堆对象时发出警告。 | | \-Wfunction-elimination | 警告函数调用消除。 | | \-Whsa | 当函数无法扩展到 HSAIL 时发出警告。 | | \-Wif-not-aligned | 当结构中的字段未对齐时发出警告。 | | \-Wignored-attributes | 每当属性被忽略时发出警告。 | | \-Wignored-qualifiers | 每当忽略类型限定符时发出警告。 | | \-Wimplicit | 警告隐式声明。 | | \-Wimplicit-fallthrough | 与 -Wimplicit-fallthrough= 相同。 请改用后一个选项。 | | \-Wimplicit-fallthrough=‹0,5› | 当开关盒掉落时发出警告。 | | \-Wimplicit-function-declaration | 对隐式函数声明发出警告。 | | \-Wimplicit-int | 当声明未指定类型时发出警告。 | | \-Wimplicit-interface | 警告有关隐式接口的调用。 | | \-Wimplicit-procedure | 对未显式声明的调用过程发出警告。 | | \-Wincompatible-pointer-types | 当具有不兼容类型的指针之间存在转换时发出警告。 | | \-Winherited-variadic-ctor | 当基类具有可变构造函数时,警告 C++11 继承构造函数。 | | \-Winit-list-lifetime | 警告使用 std::initializer\_list 可能导致悬空指针。 | | \-Winit-self | 对初始化为自身的变量发出警告。 | | \-Winline | 当内联函数无法内联时发出警告。 | | \-Wint-conversion | 警告整数到指针和指针到整数转换的不兼容。 | | \-Wint-in-bool-context | 对布尔上下文中的可疑整数表达式发出警告。 | | \-Wint-to-pointer-cast | 当从不同大小的整数强制转换为指针时发出警告。 | | \-Winteger-division | 警告常量整数除法结果被截断。 | | \-Wintrinsic-shadow | 如果用户过程与内在函数同名,则发出警告。 | | \-Wintrinsics-std | 对不属于所选标准的内部函数发出警告。 | | \-Winvalid-memory-model | 当已知原子内存模型参数超出有效范围时发出警告。 | | \-Winvalid-offsetof | 警告“offsetof”宏的无效使用。 | | \-Winvalid-pch | 警告已找到但未使用的 PCH 文件。 | | \-Wjump-misses-init | 当跳转错过变量初始化时发出警告。 | | \-Wlarger-than- | 与 -Wlarger-than= 相同。 请改用后一个选项。 | | \-Wlarger-than=‹字节大小› | 如果对象的大小超过‹字节大小›,则发出警告。 | | \-Wline-truncation | 警告源代码行被截断。 | | \-Wliteral-suffix | 当字符串或字符文字后跟不以下划线开头的 ud 后缀时发出警告。 | | \-Wlogic-not-parentheses | 在比较的左侧操作数上使用逻辑非时发出警告。 | | \-Wlogic-op | 当逻辑运算符总是可疑地评估为 true 或 false 时发出警告。 | | \-Wlong-long | 当 -pedantic 时,不要警告使用“long long”。 | | \-Wlto-type-mismatch | 在链接时优化期间警告全局声明的类型不匹配。 | | \-Wmain | 警告可疑的“main”声明。 | | \-Wmaybe-uninitialized | 警告可能未初始化的自动变量。 | | \-Wmemset-elt-size | 警告对 memset 的可疑调用,其中第三个参数包含未乘以元素大小的元素数。 | | \-Wmemset-transpose-args | 警告对 memset 的可疑调用,其中第三个参数是常量文字零,而第二个参数不是。 | | \-Wmisleading-indentation | 当代码的缩进未反映块结构时发出警告。 | | \-Wmissing-attributes | 警告实体声明可能缺少已声明相关实体的属性。 | | \-Wmissing-braces | 警告初始值设定项周围可能缺少大括号。 | | \-Wno-alloca-larger-than | \-Wno-alloca-larger-than 禁用 Walloca-larger-than= 警告。 相当于 Walloca-larger-than= | | \-Wno-vla-larger-than | \-Wno-vla-larger-than 禁用 Wvla-larger-than= 警告。 相当于 Wvla-larger-than=‹SIZE\_MAX› 或 | | \-Wnoexcept | 当 noexcept 表达式计算结果为 false 时发出警告,即使该表达式实际上无法抛出异常。 | | \-Wnoexcept-type | 如果 C++17 noexcept 函数类型将更改符号的损坏名称,则发出警告。 | | \-Wnon-template-friend | 在模板内声明非模板化友元函数时发出警告。 | | \-Wnon-virtual-dtor | 对非虚拟析构函数发出警告。 | | \-Wnonnull | 警告 NULL 被传递到标记为需要非 NULL 的参数槽。 | | \-Wnonnull-compare | 如果将具有非空属性的指针参数与 NULL 进行比较,则发出警告。 | | \-Wnormalized | 与 -Wnormalized= 相同。 请改用后一个选项。 | | \-Wnormalized=\`\[none | id | | \-Wnull-dereference | 如果取消引用 NULL 指针可能导致错误或未定义的行为,则发出警告。 | | \-Wodr | 警告链接时优化期间某些 C++ 单一定义规则违规。 | | \-Wold-style-cast | 如果程序中使用了 C 风格转换,则发出警告。 | | \-Wold-style-declaration | 警告声明中过时的用法。 | | \-Wold-style-definition | 如果使用旧式参数定义,则发出警告。 | | \-Wopenmp-simd | 如果 simd 指令被矢量化器成本模型覆盖,则发出警告。 | | \-Woverflow | 警告算术表达式中的溢出。 | | \-Woverlength-strings | 如果字符串长于标准指定的最大可移植长度,则发出警告。 | | \-Woverloaded-virtual | 对重载的虚拟函数名称发出警告。 | | \-Woverride-init | 警告覆盖初始值设定项,而不会产生副作用。 | | \-Woverride-init-side-effects | 警告有关重写初始化程序带来的副作用。 | | \-Wpacked | 当 Packed 属性对结构布局没有影响时发出警告。 | | \-Wpacked-bitfield-compat | 关于 GCC 4.4 中偏移量发生变化的打包位域发出警告。 | | \-Wpacked-not-aligned | 当具有 Packed 属性的结构中的字段未对齐时发出警告。 | | \--Wpadded | 当需要填充来对齐结构成员时发出警告。 | | \-Wpedantic | 发出严格遵守标准所需的警告。 | | \-Wpessimizing-move | 警告有关在 return 语句中对本地对象调用 std::move 的情况,以防止复制省略。 | | \-Wplacement-new | 对于具有未定义行为的放置新表达式发出警告。 与-Wplacement-new=相同。 | | \-Wplacement-new=‹0,2› | 对于具有未定义行为的放置新表达式发出警告。 | | \-Wpmf-conversions | 将指针类型转换为成员函数时发出警告。 | | \-Wpointer-arith | 关于函数指针算术的警告。 | | \-Wpointer-compare | 当指针与零字符常量进行比较时发出警告。 | | \-Wpointer-sign | 当赋值中指针的符号不同时发出警告。 | | \-Wpointer-to-int-cast | 当指针转换为不同大小的整数时发出警告。 | | \-Wpragmas | 警告有关编译指示的误用。 | | \-Wprio-ctor-dtor | 如果使用优先级为 0 到 100 的构造函数或析构函数,则发出警告。 | | \-Wproperty-assign-default | 如果 Objective-C 对象的属性没有指定分配语义,则发出警告。 | | \-Wprotocol | 如果继承的方法未实现则发出警告。 | | \-Wpsabi | 该选项缺乏文档。 | | \-Wreal-q-constant | 警告带有“q”指数字母的实数常量。 | | \-Wrealloc-lhs | 重新分配左侧数组变量时发出警告。 | | \-Wrealloc-lhs-all | 重新分配左侧变量时发出警告。 | | \-Wredundant-decls | 警告同一对象的多个声明。 | | \-Wredundant-move | 警告对 std::move 的冗余调用。 | | \-Wregister | 警告有关寄存器存储说明符的使用。 | | \-Wreorder | 当编译器重新排序代码时发出警告。 | | \-Wrestrict | 当参数传递给带有另一个参数的限制限定参数别名时发出警告。 | | \-Wreturn-local-addr | 关于返回本地或临时变量的指针/引用的警告。 | | \-Wreturn-type | 当函数的返回类型默认为“int”(C) 或不一致的返回类型 (C++) 时发出警告。 | | \-Wscalar-storage-order | 对涉及反向标量存储顺序的可疑结构发出警告。 | | \-Wselector | 如果选择器有多个方法则发出警告。 | | \-Wsequence-point | 对可能的违规行为发出警告 | | \-Wshadow | 当一个变量影响另一个变量时发出警告。 与 -Wshadow=global 相同。 | | \-Wshadow-compatible-local | 与 -Wshadow=兼容-本地相同。 请改用后一个选项。 | | \-Wshadow-ivar | 如果局部声明隐藏了实例变量,则发出警告。 | | \-Wshadow-local | 与 -Wshadow=local 相同。 请改用后一个选项。 | | \-Wshadow=compatible-local | 当一个局部变量遮盖另一局部变量或兼容类型的参数时发出警告。 | | \-Wshadow=global | 当一个变量影响另一个变量(全局)时发出警告。 与 -Wshadow 相同。 | | \-Wshadow=local | 当一个局部变量遮蔽另一局部变量或参数时发出警告。 | | \-Wshift-count-negative | 如果班次计数为负则发出警告。 | | \-Wshift-count-overflow | 如果移位计数 ›= 类型宽度,则发出警告。 | | \-Wshift-negative-value | 如果左移负值则发出警告。 | | \-Wshift-overflow | 如果有符号值的左移溢出,则发出警告。 与-Wshift-overflow=相同。 | | \-Wshift-overflow=‹0,2› | 如果有符号值的左移溢出,则发出警告。 | | \-Wsign-compare | 关于有符号与无符号比较的警告。 | | \-Wsign-conversion | 对有符号和无符号整数之间的隐式类型转换发出警告。 | | \-Wsign-promo | 当过载从无符号升级到有符号时发出警告。 | | \-Wsized-deallocation | 警告缺少大小的释放函数。 | | \-Wsizeof-array-argument | 当 sizeof 应用于声明为数组的参数时发出警告。 | | \-Wsizeof-pointer-div | 警告两个 sizeof 表达式的可疑除法,这些除法不能与指针正常工作。 | | \-Wsizeof-pointer-memaccess | 如果参数使用 sizeof,则警告某些字符串函数的可疑长度参数。 | | \-Wstack-protector | 由于某种原因未发出堆栈粉碎保护时发出警告。 | | \-Wstack-usage=‹字节大小› | 如果堆栈使用量可能超过‹字节大小›,则发出警告。 | | \-Wstrict-aliasing | 警告可能违反严格别名规则的代码。 | | \-Wstrict-aliasing=‹0,3› | 警告可能违反严格别名规则的代码。 | | \-Wstrict-null-sentinel | 对用作哨兵的未强制转换的 NULL 发出警告。 | | \-Wstrict-overflow | 对假设有符号溢出未定义的优化发出警告。 | | \-Wstrict-overflow=‹0,5› | 对假设有符号溢出未定义的优化发出警告。 | | \-Wstrict-prototypes | 对非原型函数声明发出警告。 | | \-Wstrict-selector-match | 如果候选方法的类型签名不完全匹配,则发出警告。 | | \-Wstringop-overflow | 警告字符串操作函数(如 memcpy 和 strcpy)中的缓冲区溢出。 与 -Wstringop-overflow= 相同。 | | \-Wstringop-overflow=‹0,4› | 在对象大小类型的控制下,警告字符串操作函数(如 memcpy 和 strcpy)中的缓冲区溢出。 | | \-Wstringop-truncation | 对 strncat 和 strncpy 等字符串操作函数中的截断发出警告。 | | \-Wsubobject-linkage | 如果类类型具有其类型使用匿名命名空间或依赖于无链接的类型的基类或字段,则发出警告。 | | \-Wsuggest-attribute=cold | 警告可能是 `__attribute__((cold))` 候选函数的函数。 | | \-Wsuggest-attribute=const | 警告可能是 `__attribute__((const))` 候选函数的函数。 | | \-Wsuggest-attribute=format | 警告可能是格式属性候选者的函数。 | | \-Wsuggest-attribute=malloc | 警告可能是 `__attribute__((malloc))` 候选函数的函数。 | | \-Wsuggest-attribute=noreturn | 警告可能是 `__attribute__((noreturn))` 候选函数的函数。 | | \-Wsuggest-attribute=pure | 警告可能是 `__attribute__((pure))` 候选函数的函数。 | | \-Wsuggest-final-methods | 对 C++ 虚拟方法发出警告,其中添加 Final 关键字将提高代码质量。 | | \-Wsuggest-final-types | 对 C++ 多态类型发出警告,其中添加 Final 关键字将提高代码质量。 | | \-Wsuggest-override | 建议当虚函数的声明覆盖另一个虚函数时使用 override 关键字。 | | \-Wsurprising | 警告“可疑”结构。 | | \-Wswitch | 警告枚举开关,没有默认值,缺少大小写。 | | \-Wswitch-bool | 警告带有布尔控制表达式的开关。 | | \-Wswitch-default | 警告枚举开关缺少“default:”语句。 | | \-Wswitch-enum | 警告所有枚举开关缺少特定情况。 | | \-Wswitch-unreachable | 对 switch 的控制表达式和第一种情况之间的语句发出警告。 | | \-Wsync-nand | 使用 \_\_sync\_fetch\_and\_nand 和 \_\_sync\_nand\_and\_fetch 内置函数时发出警告。 | | \-Wsynth | 已弃用。 该开关没有任何作用。 | | \-Wsystem-headers | 不要抑制来自系统标头的警告。 | | \-Wtabs | 允许制表符的不合格使用。 | | \-Wtarget-lifetime | 如果指针赋值中的指针可能比其目标寿命更长,则发出警告。 | | \-Wtautological-compare | 如果比较结果始终为 true 或 false,则发出警告。 | | \-Wtemplates | 对主模板声明发出警告。 | | \-Wterminate | 如果 throw 表达式总是导致调用 Terminate(),则发出警告。 | | \-Wtraditional | 对传统 C 中不存在的功能发出警告。 | | \-Wtraditional-conversion | 警告原型导致的类型转换与没有原型时发生的类型转换不同。 | | \-Wtrampolines | 每当生成蹦床时发出警告。 | | \-Wtrigraphs | 如果遇到可能影响程序含义的三字母组,则发出警告。 | | \-Wtype-limits | 如果由于数据类型的有限范围而导致比较始终为 true 或始终为 false,则发出警告。 | | \-Wundeclared-selector | 警告没有先前声明的方法的 @selector()。 | | \-Wundef | 如果 #if 指令中使用了未定义的宏,则发出警告。 | | \-Wundefined-do-loop | 警告无效的 DO 循环。 | | \-Wunderflow | 警告数值常量表达式下溢。 | | \-Wuninitialized | 警告未初始化的自动变量。 | | \-Wunknown-pragmas | 警告无法识别的pragmas。 | | \-Wunreachable-code | 不执行任何操作。 保留是为了向后兼容。 | | \-Wunsafe-loop-optimizations | 什么也不做。 保留是为了向后兼容。 | | \-Wunsuffixed-float-constants | 警告无后缀的浮点常量。 | | \-Wunused | 启用所有 -Wunused- 警告。 | | \-Wunused-but-set-parameter | 当函数参数仅被设置时发出警告,否则未使用。 | | \-Wunused-but-set-variable | 当变量仅被设置时发出警告,否则未使用。 | | \-Wunused-const-variable | 当 const 变量未被使用时发出警告。 与 -Wunused-const-variable= 相同。 | | \-Wunused-const-variable=‹0,2› | 当 const 变量未被使用时发出警告。 | | \-Wunused-dummy-argument | 警告未使用的虚拟参数。 | | \-Wunused-function | 当函数未被使用时发出警告。 | | \-Wunused-label | 当标签未使用时发出警告。 | | \-Wunused-local-typedefs | 当未使用函数中本地定义的 typedef 时发出警告。 | | \-Wunused-macros | 警告主文件中定义的未使用的宏。 | | \-Wunused-parameter | 当函数参数未使用时发出警告。 | | \-Wunused-result | 如果用属性 warn\_unused\_result 标记的函数的调用者不使用其返回值,则发出警告 | | \-Wunused-value | 当表达式值未使用时发出警告。 | | \-Wunused-variable | 当变量未被使用时发出警告。 | | \-Wuse-without-only | 警告没有 ONLY 限定符的 USE 语句。 | | \-Wuseless-cast | 警告无用的施法。 | | \-Wvarargs | 警告用于检索变量参数的宏的可疑使用。 | | \-Wvariadic-macros | 警告有关使用可变参数宏。 | | \-Wvector-operation-performance | 在 SIMD 外部编译向量运算时发出警告。 | | \-Wvirtual-inheritance | 对直接虚拟继承发出警告。 | | \-Wvirtual-move-assign | 如果虚拟基地具有重要的移动分配运算符,则发出警告。 | | \-Wvla | 如果使用可变长度数组则发出警告。 | | \-Wvla-larger-than= | 对可变长度数组的无限使用以及边界可能大于字节的可变长度数组的有限使用发出警告。 ‹数 | | \-Wvolatile-register-var | 当寄存器变量被声明为易失性时发出警告。 | | \-Wwrite-strings | 在 C++ 中,非零表示警告已弃用的从字符串文字到“char \*”的转换。在C中,类似的警告,除了转换当然是ISO C 标准 | | \-Wzero-as-null-pointer-constant | 当文字“0”用作空指针时发出警告。 | | \-Wzerotrip | 警告零跳闸 DO 循环。 | | \-frequire-return-statement | 返回值的函数必须以 return 语句结尾。 |
CopyRight 2002~2023 精通2100网 联系邮箱:qqtxt@163.com
版权所有:精通2100网
湘ICP备2023018646号-1
MYSQl共执行 4 个查询,用时 0.0020039081573486 秒,PHP脚本用时 0.005670 秒,占用内存 0.785 MB,Gzip 已启用