未验证 提交 82fe3227 编写于 作者: P pjscc 提交者: Gitee

update zh-cn/contribute/OpenHarmony-compile-rule.md.

Signed-off-by: Npjscc <pangjiashuai@h-partners.com>
上级 ea6f1de4
......@@ -707,13 +707,13 @@ warning: by 'void Sub::f(int)' [-Woverloaded-virtual] void f(int);
**Linux平台用户态**
**作用阶段**:编译选项
作用阶段:编译选项
**作用范围:**可重定位文件(.o)、动态库、可执行程序
作用范围:可重定位文件(.o)、动态库、可执行程序
**用法:**-fstack-protector-all/-fstack-protector-strong
用法:-fstack-protector-all/-fstack-protector-strong
**说明:**当存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来劫持程序控制流。启用栈保护后,在缓冲区和控制信息间插入一个canary word。攻击者在覆盖返回地址的时候,往往也会覆盖canary word。通过检查canary word的值是否被修改,就可以判断是否发生了溢出攻击。
**说明:** 当存在缓冲区溢出攻击漏洞时,攻击者可以覆盖栈上的返回地址来劫持程序控制流。启用栈保护后,在缓冲区和控制信息间插入一个canary word。攻击者在覆盖返回地址的时候,往往也会覆盖canary word。通过检查canary word的值是否被修改,就可以判断是否发生了溢出攻击。
1\. GCC4.9版本及以上落地-fstack-protector-strong;
......@@ -723,11 +723,11 @@ warning: by 'void Sub::f(int)' [-Woverloaded-virtual] void f(int);
**Linux平台内核**
**作用阶段**:编译选项
作用阶段:编译选项
**作用范围:**Linux平台内核态
作用范围:Linux平台内核态
**用法:**内核编译前打开配置CONFIG_CC_STACKPROTECTOR/CONFIG_CC_STACKPROTECTOR_STRONG
用法:内核编译前打开配置CONFIG_CC_STACKPROTECTOR/CONFIG_CC_STACKPROTECTOR_STRONG
**说明:**
......@@ -743,13 +743,13 @@ warning: by 'void Sub::f(int)' [-Woverloaded-virtual] void f(int);
**LiteOS平台**
**作用阶段**:编译选项
作用阶段:编译选项
**作用范围:**LiteOS V200R003C00及之后的版本
作用范围:LiteOS V200R003C00及之后的版本
**用法:**-fstack-protector-all/-fstack-protector-strong
用法:-fstack-protector-all/-fstack-protector-strong
**说明:**1.GCC4.9版本及以上落地-fstack-protector-strong;
**说明:** 1.GCC4.9版本及以上落地-fstack-protector-strong;
2.GCC4.9版本以下落地-fstack-protector-all。
......@@ -761,21 +761,21 @@ warning: by 'void Sub::f(int)' [-Woverloaded-virtual] void f(int);
##### G.C&C++.SEC.02 打开地址随机化选项
【级别】 要求
**【级别】** 要求
windows平台HighASLR & ForceASLR选项实施级别为建议
【描述】
**【描述】**
**Linux(用户态)**
**a. 使用命令 echo 2 \>/proc/sys/kernel/randomize_va_space 打开系统随机化配置**
**作用阶段:**运行系统配置
**作用阶段:** 运行系统配置
**作用范围:**堆、栈、内存映射区(mmap基址、shared libraries、vdso页)
**作用范围:** 堆、栈、内存映射区(mmap基址、shared libraries、vdso页)
**用法:**echo 2 \>/proc/sys/kernel/randomize_va_space
**用法:** echo 2 \>/proc/sys/kernel/randomize_va_space
**说明**
......@@ -789,7 +789,7 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**作用范围**:动态库
**用法:**–fPIC(-fpic)
**用法:** –fPIC(-fpic)
**说明:**
......@@ -799,11 +799,11 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**c. 打开PIE选项实现可执行文件随机加载**
**作用阶段:**编译链接选项
**作用阶段:** 编译链接选项
**作用范围:**可执行程序
**作用范围:** 可执行程序
**用法:**–fPIE(-fpie)-pie
**用法:** –fPIE(-fpie)-pie
**说明:**
......@@ -819,13 +819,13 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**a. 配置代码段、数据段随机加载**
**作用阶段:**编译、链接选项以及运行系统配置
**作用阶段:** 编译、链接选项以及运行系统配置
**作用范围:**LiteOS V200R003C00及之后的版本
**作用范围:** LiteOS V200R003C00及之后的版本
**用法:**先编译成可随机的镜像;然后镜像加载时,对地址进行随机修正
**用法:** 先编译成可随机的镜像;然后镜像加载时,对地址进行随机修正
**说明:**1.依赖支持随机地址加载的bootloader,依赖MMU、DDR空间。
**说明:** 1.依赖支持随机地址加载的bootloader,依赖MMU、DDR空间。
2.开启后性能下降10%左右。
......@@ -843,29 +843,29 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**b.配置动态库随机加载**
**作用阶段:**编译选项
**作用阶段:** 编译选项
**作用范围:**LiteOS V200R003C00及之后的版本
**作用范围:** LiteOS V200R003C00及之后的版本
**用法:**-fPIC
**用法:** -fPIC
**说明:**1.动态库编译阶段采用-fPIC。
**说明:** 1.动态库编译阶段采用-fPIC。
##### G.C&C++.SEC.03 打开GOT表重定位只读选项
【级别】 要求
**【级别】** 要求
【描述】
**【描述】**
**Linux平台-用户态**
**a.部分重定向只读选项:**
**作用阶段:** 链接选项
**作用阶段:**链接选项
**作用范围:**动态库、可执行程序
**作用范围:** 动态库、可执行程序
**用法:**-Wl,-z,relro
**用法:** -Wl,-z,relro
**说明**
......@@ -873,11 +873,11 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**b.全部重定向只读选项:**
**作用阶段:**链接选项
**作用阶段:** 链接选项
**作用范围:**动态库、可执行程序
**作用范围:** 动态库、可执行程序
**用法:**-Wl,-z,now
**用法:** -Wl,-z,now
**说明**
......@@ -887,17 +887,17 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
##### G.C&C++.SEC.04 打开堆栈不可执行/数据执行保护选项实现堆栈不可执行保护
【级别】 要求
**【级别】** 要求
【描述】
**【描述】**
**Linux平台-用户态**
**作用阶段**链接选项
**作用阶段:** 链接选项
**作用范围:**动态库、可执行程序
**作用范围:** 动态库、可执行程序
**用法**-Wl,-z,noexecstack
**用法:** -Wl,-z,noexecstack
**说明**
......@@ -907,13 +907,13 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**LiteOS平台**
**作用阶段**运行系统配置
**作用阶段:** 运行系统配置
**作用范围:**LiteOS V200R003C00及之后的版本
**作用范围:** LiteOS V200R003C00及之后的版本
**用法:**运行时配置堆栈不可执行、数据段(BSS,DATA)不可执行
**用法:** 运行时配置堆栈不可执行、数据段(BSS,DATA)不可执行
**说明:**1.依赖硬件支持MMU/MPU/PMP等内存保护单元。
**说明:** 1.依赖硬件支持MMU/MPU/PMP等内存保护单元。
##### G.C&C++.SEC.05 使用-s选项或者strip工具去除符号表
......@@ -923,11 +923,11 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**Linux平台-用户态**
**作用阶段:**链接选项
**作用阶段:** 链接选项
**作用范围:**动态库、可执行程序
**作用范围:** 动态库、可执行程序
**用法:**-s(strip工具)
**用法:** -s(strip工具)
**说明:**
......@@ -949,27 +949,27 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**LiteOS平台**
**作用阶段**链接选项
**作用阶段:**链接选项
**作用范围:**LiteOS V200R003C00及之后的版本
**作用范围:** LiteOS V200R003C00及之后的版本
**用法:**-s(strip)
**用法:** -s(strip)
**说明:**1.LiteOS产品最终用于烧录的编译结果为bin文件,本身不存在符号表信息,建议不开启。
**说明:** 1.LiteOS产品最终用于烧录的编译结果为bin文件,本身不存在符号表信息,建议不开启。
##### G.C&C++.SEC.06 禁止使用Run-time Search Path选项
【级别】要求
**【级别】** 要求
【描述】
**【描述】**
**Linux平台-用户态**
**作用阶段:**链接选项
**作用阶段:** 链接选项
**作用范围:**动态库、可执行程序
**作用范围:** 动态库、可执行程序
**用法:**-Wl,--disable-new-dtags,--rpath,/libpath1:/libpath2;-Wl,--enable-new-dtags,--rpath,/libpath1:/libpath2
**用法:** -Wl,--disable-new-dtags,--rpath,/libpath1:/libpath2;-Wl,--enable-new-dtags,--rpath,/libpath1:/libpath2
**说明**
......@@ -977,33 +977,33 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
##### G.C&C++.SEC.07 打开代码段/数据段写保护选项
【级别】建议
**【级别】**建议
【描述】
**【描述】**
**LiteOS平台**
**a. 配置代码段、只读数据段写保护**
**作用阶段:**运行系统配置
**作用阶段:** 运行系统配置
**作用范围**LiteOS V200R003C00及之后的版本
**作用范围:** LiteOS V200R003C00及之后的版本
**用法**运行时配置代码段、ReadOnly Data段不可修改
**用法:** 运行时配置代码段、ReadOnly Data段不可修改
**说明**1.依赖硬件支持MMU/MPU/PMP等内存保护单元。
**说明:** 1.依赖硬件支持MMU/MPU/PMP等内存保护单元。
##### G.C&C++.SEC.10 启用FORTIFY_SOURCE编译宏来打开FS选项
【级别】建议
**【级别】** 建议
【描述】
**【描述】**
**Linux平台-用户态**
**作用阶段:**编译选项
**作用阶段:** 编译选项
**用法:**-D_FORTIFY_SOURCE=2 -O2
**用法:** -D_FORTIFY_SOURCE=2 -O2
**说明**
......@@ -1015,13 +1015,13 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
**LiteOS平台**
**作用阶段:**编译选项
**作用阶段:** 编译选项
**作用范围:**LiteOS V200R003C00及之后的版本
**作用范围:** LiteOS V200R003C00及之后的版本
**用法:**-D_FORTIFY_SOURCE=2 -O2
**用法:** -D_FORTIFY_SOURCE=2 -O2
**说明:**1. 选项收益和lib库实现有关。
**说明:** 1. 选项收益和lib库实现有关。
2.当前LiteOS使用musl库,如果产品替换支持相关功能的lib库,需按需开启。
......@@ -1031,9 +1031,9 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
##### G.C&C++.SEC.11 打开ftrapv选项来检测整数溢出
【级别】建议
**【级别】** 建议
【描述】
**【描述】**
**Linux平台-用户态、LiteOS平台**
......@@ -1047,21 +1047,21 @@ ASLR是一种针对缓冲区溢出的安全保护技术,通过对堆、栈、
##### G.C&C++.SEC.13 打开栈检查选项
【级别】
**【级别】**
Linux平台-用户态:建议
LiteOS平台:要求(禁用)
【描述】
**【描述】**
**Linux平台-用户态**
**作用阶段**编译选项
**作用阶段:** 编译选项
**作用范围:**可重定位文件、动态库、可执行程序
**作用范围:** 可重定位文件、动态库、可执行程序
**用法:**-fstack-check
**用法:** -fstack-check
**说明:**
......@@ -1069,17 +1069,17 @@ stack-check在编译时检查程序中栈空间,如果超过编译告警阀值
性能影响较大,建立在Debug版本中实施,Release版本不实施
**实施建议:**可选
**实施建议:** 可选
**LiteOS平台**
**作用阶段**编译选项
**作用阶段:** 编译选项
**作用范围:**LiteOS V100R003C00及之后的版本
**作用范围:** LiteOS V100R003C00及之后的版本
**用法:**-fstack-check
**用法:** -fstack-check
**说明:**1.开启后程序会访问非法地址,导致执行异常,因此LiteOS平台下禁止打开栈检查选项。
**说明:** 1.开启后程序会访问非法地址,导致执行异常,因此LiteOS平台下禁止打开栈检查选项。
### 优化选项
......@@ -1087,26 +1087,26 @@ stack-check在编译时检查程序中栈空间,如果超过编译告警阀值
##### P.C&C++.01 在实测的基础上,选择合适优化等级和各种优化选项
【描述】在实测的基础上,尝试各种代码优化选项,以查看它们是否确实为生成程序更快。
**【描述】** 在实测的基础上,尝试各种代码优化选项,以查看它们是否确实为生成程序更快。
##### G.C&C++.OPT.01 优化等级建议选"-O2"、"-Os"、"-O3"
【级别】建议
**【级别】** 建议
##### G.C&C++.OPT.02 当代码中存在较多的不同类型指针互转时,使用"-fno-strict-aliasing"选项关闭严格别名优化
【级别】建议
**【级别】** 建议
【描述】GCC的"-O2"打开"-fstrict-aliasing"严格别名规则优化:编译器假定相同的内存地址绝不会存放不同类型的数据,该优化选项相对激进。为了避免代码中不同类型指针互转导致优化问题,可以使用"-fno-strict-aliasing"关闭优化;最好的方式是修改代码,遵守严格别名规则。
**【描述】** GCC的"-O2"打开"-fstrict-aliasing"严格别名规则优化:编译器假定相同的内存地址绝不会存放不同类型的数据,该优化选项相对激进。为了避免代码中不同类型指针互转导致优化问题,可以使用"-fno-strict-aliasing"关闭优化;最好的方式是修改代码,遵守严格别名规则。
注意使用"-fno-strict-aliasing"选项可能会影响产品性能,如某产品一个性能敏感组件实测,"-O2
\-fno-strict-aliasing"相比"-O2"会有性能下降,测的数据最多下降有9%。
##### G.C&C++.OPT.03 X86/ARM架构下,基于DOPRA平台的产品建议使用"-fno-omit-frame-pointer"选项关闭去SFP(Stack Frame Pointer)优化
【级别】建议
**【级别】** 建议
【描述】"-fno-omit-frame-pointer":GCC的“-O”
**【描述】** "-fno-omit-frame-pointer":GCC的“-O”
("-O1")会打开"-fomit-frame-pointer"优化选项,也就是去掉函数调用时的frame
pointer,优化会导致代码难以调试,建议通过选项"-fno-omit-frame-pointer"禁止该项优化。
......@@ -1118,15 +1118,15 @@ pointer,优化会导致代码难以调试,建议通过选项"-fno-omit-frame
##### G.C&C++.CDG.01 未初始化的全局变量放置在目标文件的数据段:"-fno-common"
【级别】要求
**【级别】** 要求
【描述】"-fno-common":未初始化的全局变量放置在目标文件的数据段,两个不同的编译单元中声明了同一个全局变量导致警告。多个临时的全局变量定义会增加代码维护难度,降低链接速度和增加空间消耗。
**【描述】** "-fno-common":未初始化的全局变量放置在目标文件的数据段,两个不同的编译单元中声明了同一个全局变量导致警告。多个临时的全局变量定义会增加代码维护难度,降低链接速度和增加空间消耗。
##### G.C&C++.CDG.02 将结构体放在寄存器中直接返回:"-freg-struct-return"
【级别】建议
**【级别】** 建议
【描述】"-freg-struct-return":采用寄存器返回结构与联合值。
**【描述】** "-freg-struct-return":采用寄存器返回结构与联合值。
“-fpcc-struct-return”:在返回短的结构和联合值时,与较长的值一样,使用内存而非寄存器。
......@@ -1138,15 +1138,15 @@ CC缺省使用目标机器指定的标准规则。如果没有标准规则,
##### G.C&C++.CDG.03 设置默认的ELF镜像中符号的可见性为隐藏:"-fvisibility=hidden"
【级别】建议
**【级别】** 建议
【描述】"-fvisibility=hidden":可以让动态库中仅API外部可见,有效实现二进制的模块化。使用该选项可以提高动态库链接和加载的速度,防止符号冲突。但该选项加上后,需要考虑对该模块函数打补丁的成本,因为原来的全局符号变成LOCAL属性,对其打补丁时需要重新组名(DOPRA补丁规范有详细的组名规则),构建补丁的成本会增加。是否打开该选项,需要权衡。
**【描述】** "-fvisibility=hidden":可以让动态库中仅API外部可见,有效实现二进制的模块化。使用该选项可以提高动态库链接和加载的速度,防止符号冲突。但该选项加上后,需要考虑对该模块函数打补丁的成本,因为原来的全局符号变成LOCAL属性,对其打补丁时需要重新组名(DOPRA补丁规范有详细的组名规则),构建补丁的成本会增加。是否打开该选项,需要权衡。
##### G.C&C++.CDG.04 启用表达式计算顺序强化规则: “-fstrong-eval-order”
【级别】建议
**【级别】** 建议
【描述】"-fstrong-eval-order":按C++17的规格确定子表达式之间的计算顺序,比如表达式
**【描述】** "-fstrong-eval-order":按C++17的规格确定子表达式之间的计算顺序,比如表达式
T().m_i = A().B() 在未开启时可能生成指令的求值顺序时 A() T() B() ,不符合常规预期;该选项当启用 "-std=c++17" 时自动开启, 但当前 gcc7.3默认"-std=c++14",建议显式开启以降低不可预期行为。
### 总体选项
......@@ -1155,9 +1155,9 @@ T().m_i = A().B() 在未开启时可能生成指令的求值顺序时 A() T() B(
##### G.C&C++.OVA.01 打开总体选项:"-pipe"
【级别】建议
**【级别】** 建议
【描述】"-pipe" :编译过程中多管道并发,节省编译时间
**【描述】** "-pipe" :编译过程中多管道并发,节省编译时间
### 架构选项
......@@ -1169,7 +1169,7 @@ T().m_i = A().B() 在未开启时可能生成指令的求值顺序时 A() T() B(
2. 指令集 (如:march=armv7-a/ march=armv8-a)
【级别】要求
**【级别】** 要求
### 链接选项
......@@ -1177,9 +1177,9 @@ T().m_i = A().B() 在未开启时可能生成指令的求值顺序时 A() T() B(
##### G.C&C++.LNK.01 打开如下链接选项:"-Wl,-Bsymbolic"、"-rdynamic"、" -Wl,--no-undefined"
【级别】建议
**【级别】** 建议
【描述】-Wl,-Bsymbolic:同名符号优先使用本so,减少got表调转
**【描述】** -Wl,-Bsymbolic:同名符号优先使用本so,减少got表调转
"-rdynamic":解决dlopen反向依赖的问题;BIN文件通过地址返回符号名称,需要加,否则backtrace_symbol返回的是地址,不能定位;影响:产品BIN文件增大。
"-Wl,--no-undefined":可以将运行时加载错误,在链接期提前识别出来。打开该选项,导致链接时间会变长,因为链接期要进行依赖关系校验。如果-l指定依赖库不全,会有功能问题,需要产品权衡。
......@@ -1190,9 +1190,9 @@ T().m_i = A().B() 在未开启时可能生成指令的求值顺序时 A() T() B(
##### G.C&C++.DBG.01 对于版本发布构建,禁止携带调试信息
【级别】要求
**【级别】** 要求
【描述】调试信息指 符号表 和
**【描述】** 调试信息指 符号表 和
详细调试信息表,根据当前安全规定,调试信息,不是运行所必须,要求发布件删除这些信息,包括符号表,以提升攻击难度;热补丁、perf分析、抓堆栈等维测场景受影响。
使用 "-s" 链接选项可完全不生成调试信息,需注意此方法生成的组件与不加 "-s"
......@@ -1205,9 +1205,9 @@ T().m_i = A().B() 在未开启时可能生成指令的求值顺序时 A() T() B(
##### G.C&C++.PRE.01 明确-D编译宏的具体用途,建立-D编译宏的清单
【级别】要求
**【级别】** 要求
【描述】每增加一个-D编译宏,就需要对它进行额外的测试。为每一种软件-D编译宏所作的代码修改,必须验证能否适用于其他-D编译宏。首先必须针对所有的-D编译宏,对软件进行构建,以确保没有编译错误;其次必须针对所有的-D编译宏进行完整的测试。
**【描述】** 每增加一个-D编译宏,就需要对它进行额外的测试。为每一种软件-D编译宏所作的代码修改,必须验证能否适用于其他-D编译宏。首先必须针对所有的-D编译宏,对软件进行构建,以确保没有编译错误;其次必须针对所有的-D编译宏进行完整的测试。
对于未使用的-D编译宏,应该直接删除。
......@@ -1216,15 +1216,13 @@ T().m_i = A().B() 在未开启时可能生成指令的求值顺序时 A() T() B(
##### G.C&C++.OTH.01 同一构建工程中,避免使用重复的或包含关系的编译选项
【级别】建议
**【级别】** 建议
【描述】重复的编译选项是冗余信息,不利于维护。如果编译选项具有不同的参数,可能导致与初始预期不同的方式编译源文件。
**【描述】** 重复的编译选项是冗余信息,不利于维护。如果编译选项具有不同的参数,可能导致与初始预期不同的方式编译源文件。
编译选项之间存在包含关系时,同时使用会导致冗余。譬如"-Wall"包含40多个子警告选项,"-O"包含40多个子优化选项,当它们与子选项同时使用时就会导致冗余。
【错误示例】某组件对编译优化选项"-O"取值达到7055次,其中同一构建工程中出现多个"-O",如"-O2...-O6"、"-O2...-O3"。
【错误示例】
**【错误示例】** 某组件对编译优化选项"-O"取值达到7055次,其中同一构建工程中出现多个"-O",如"-O2...-O6"、"-O2...-O3"。
\# "-Wall"包含"-Waddress",同时使用产生冗余
......@@ -1236,14 +1234,15 @@ gcc -O -fauto-inc-dec -c test.c -o test.o
##### G.C&C++.OTH.02 避免使用相反冲突的选项
【级别】建议
**【级别】** 建议
【描述】大多数'-f'和'-W'有两个相反的互相否定的选项:
**【描述】** 大多数'-f'和'-W'有两个相反的互相否定的选项:
\-fname/-fno-name和-Wname/-Wno-name,同时引用导致冲突,令人疑惑,不利于维护。
【错误示例】
**【错误示例】**
\#同时引用-fomit-frame-pointer和-fno-omit-frame-pointer
```
set(CMAKE_C_FLAGS "-MD -MF -Wall -save-temps -fverbose-asm -fsigned-char
\-fomit-frame-pointer -fno-stack-protector \\
......@@ -1254,11 +1253,12 @@ set(CMAKE_C_FLAGS "-MD -MF -Wall -save-temps -fverbose-asm -fsigned-char
##### G.C&C++.OTH.03 编译选项的编写顺序:优化等级(如-O2)+总体选项+警告选项+语言选项+代码生成选项+架构选项(MD-Dependent Options)+优化选项+安全编译选项+自定义宏
【级别】建议
**【级别】** 建议
**【描述】** 有选项集的,先写选项集,例如"-Wall"应该写到"-Wformat=2"前。
【描述】有选项集的,先写选项集,例如"-Wall"应该写到"-Wformat=2"前。
**【正确示例】**
【正确示例】
```
\# Copyright (c) Huawei Technologies Co., Ltd. 2019. All rights reserved.
\# toolchain for ARMA15(without FPU)HI1381/HI1215
......@@ -1297,9 +1297,9 @@ set(PIE_EXE_LNK_FLAGS "-pie \${PUBLIC_LNK_FLAGS}")
##### G.JAVA.LANG.01 每个交付单元使用的Java编译语言级别必须一致,且必须与使用的Java版本对应的编译语言级别一致。
【级别】 要求
**【级别】** 要求
**描述**不同模块的编译语言级别不一致,这些模块需要配置不同的编译选项,导致构建脚本不一致。
**【描述】** 不同模块的编译语言级别不一致,这些模块需要配置不同的编译选项,导致构建脚本不一致。
使用与Java版本对应的编译语言级别,可以在编译阶段提示对应Java版本不推荐的编码实践,如Java 8版本将Java 7版本部分可用的API标记为 @Deprecated,推荐用更好的API来替换。当使用编译语言级别8时就会在编译阶段发出警告,代码中使用了将被弃用的API。
......@@ -1308,27 +1308,27 @@ set(PIE_EXE_LNK_FLAGS "-pie \${PUBLIC_LNK_FLAGS}")
##### G.JAVA.MAVEN.01 版本发布构建时禁止使用maven 编译选项-X,避免输出大量的debug日志。
【级别】 要求
**【级别】** 要求
**描述**-X是debug选项,会输出大量的debug日志。
**【描述】** -X是debug选项,会输出大量的debug日志。
### JAVAC
#### 选项集
##### G.JAVA.JAVAC.01 禁止使用的javac编译选项:-nowarn/-Xlint:none/-Xlint:name 选项关闭所有或部分javac编译告警;-g:none/-g:[keyword list]选项关闭全部或指定生成部分调试信息
【级别】 要求
**【级别】** 要求
**描述**编译告警能够帮助提前发现代码存在的缺陷和风险,关闭编译告警会给代码质量带来隐患;使用-g:none或-g:[keywordlist]会导致生成过少或过多的调试信息,影响可维护性或降低运行效率。
**【描述】** 编译告警能够帮助提前发现代码存在的缺陷和风险,关闭编译告警会给代码质量带来隐患;使用-g:none或-g:[keywordlist]会导致生成过少或过多的调试信息,影响可维护性或降低运行效率。
**例外**:-Xlint:all,-processing
运行时处理的注解不需要注解处理器,产生编译告警可以通过-Xlint的参数-processing进行抑制。
##### G.JAVA.JAVAC.02 必须使用的javac编译选项:-source,-target,-Xlint:all。 同时maven-compiler-plugin的showWarnings属性必须设置为true。
【级别】 要
**【级别】**
**描述**
**【描述】**
\-source 指定编译器接受的java源文件版本
......@@ -1338,7 +1338,7 @@ set(PIE_EXE_LNK_FLAGS "-pie \${PUBLIC_LNK_FLAGS}")
showWarnings 属性必须设置为true,不设置或者设置为false时部分编译告警无法检查出来
**正确示例**
**【正确示例】**
```
\<plugin\>
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册