Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
OpenHarmony
Docs
提交
82fe3227
D
Docs
项目概览
OpenHarmony
/
Docs
大约 1 年 前同步成功
通知
159
Star
292
Fork
28
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
D
Docs
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
未验证
提交
82fe3227
编写于
12月 21, 2022
作者:
P
pjscc
提交者:
Gitee
12月 21, 2022
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
update zh-cn/contribute/OpenHarmony-compile-rule.md.
Signed-off-by:
N
pjscc
<
pangjiashuai@h-partners.com
>
上级
ea6f1de4
变更
1
隐藏空白更改
内联
并排
Showing
1 changed file
with
127 addition
and
127 deletion
+127
-127
zh-cn/contribute/OpenHarmony-compile-rule.md
zh-cn/contribute/OpenHarmony-compile-rule.md
+127
-127
未找到文件。
zh-cn/contribute/OpenHarmony-compile-rule.md
浏览文件 @
82fe3227
...
...
@@ -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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录