diff --git a/zh-cn/contribute/OpenHarmony-compile-rule.md b/zh-cn/contribute/OpenHarmony-compile-rule.md index a71ccc11ce22362460bc7db2f0bb20f261e4e019..92267572ed5c75be2323d962d2db09ad2b5dd9c5 100644 --- a/zh-cn/contribute/OpenHarmony-compile-rule.md +++ b/zh-cn/contribute/OpenHarmony-compile-rule.md @@ -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时部分编译告警无法检查出来 -【**正确示例**】 +**【正确示例】** ``` \