C语言编码规范

合集下载

C语言中的安全编码规则与规范

C语言中的安全编码规则与规范

C语言中的安全编码规则与规范C语言是一种广泛应用于软件开发的编程语言,然而,由于其强大的灵活性,C语言也有潜在的安全风险。

为了减少安全漏洞的发生,并确保编写的代码的质量与安全性,软件开发者需要遵循一些安全编码规则与规范。

本文将介绍C语言中常见的安全编码规则与规范,帮助开发者编写更安全、更可靠的代码。

1. 输入验证与过滤在C语言中,输入验证和过滤是保证安全的第一步。

开发者应该始终对外部输入数据进行验证,确保数据的类型、范围和长度符合预期。

特别是对于字符串输入,需要检查输入的长度,以防止缓冲区溢出攻击。

同时,还应该过滤输入数据,删除或转义特殊字符,以防止跨站脚本攻击或SQL注入等常见的安全威胁。

2. 内存管理与缓冲区溢出在C语言中,内存管理是一个关键的安全问题。

开发者应该注意使用动态内存分配函数(如malloc)时,合理管理内存的分配和释放,避免内存泄漏和悬挂指针等问题。

此外,必须非常小心操作缓冲区,确保不会发生缓冲区溢出。

使用安全的字符串操作函数(如strcpy_s和strncpy_s)来替代不安全的函数(如strcpy和strncpy),并确保缓冲区的大小足够。

3. 整数溢出与溢出检查在C语言中,整数溢出是一个常见的安全问题。

开发者应该对可能引发整数溢出的操作进行正确的检查和处理。

使用带符号整数进行算术运算时,要注意结果是否会溢出。

可以使用无符号整数或者增加运算结果的大小检查来避免整数溢出。

4. 随机数和加密安全的随机数生成对于密码学和安全敏感的应用程序至关重要。

C语言提供的rand函数并不是一个安全的随机数生成器,开发者应该使用操作系统提供的安全的随机数生成函数(如/dev/random或CryptGenRandom等)来生成随机数。

在进行加密操作时,也应该选择使用强大的加密算法,并遵循最佳实践来保护敏感数据。

5. 错误处理与异常处理在C语言中,适当的错误处理与异常处理是编写安全代码的一部分。

C语言中的安全性代码编码规范与最佳实践

C语言中的安全性代码编码规范与最佳实践

C语言中的安全性代码编码规范与最佳实践在软件开发领域中,安全性是一个至关重要的因素。

为了确保C语言代码的安全性,开发人员需要遵循一定的编码规范和最佳实践。

本文将介绍一些C语言中相关的安全性代码编码规范与最佳实践,以帮助开发人员编写更加安全的代码。

1. 输入验证在C语言中,输入验证是确保代码安全性的关键步骤之一。

开发人员应该始终验证用户输入,以避免潜在的安全漏洞。

以下是一些常见的输入验证措施:1.1 长度验证:验证用户输入的长度是否符合预期,防止缓冲区溢出的风险。

1.2 类型验证:确保用户输入的数据类型与预期类型相匹配,防止类型转换错误。

1.3 格式验证:针对特定的输入数据格式进行验证,例如邮箱、电话号码等。

2. 内存安全在C语言中,内存安全是一个常见的安全隐患。

通过以下措施,可以减少内存安全问题的发生:2.1 使用安全的库函数:C语言提供了一系列安全的库函数,如strcpy_s和strcat_s等,用于替代不安全的函数,如strcpy和strcat,以减少缓冲区溢出的风险。

2.2 动态内存分配与释放:在使用动态内存分配函数(如malloc和free)时,务必注意正确释放内存,防止内存泄漏。

3. 错误处理与日志记录良好的错误处理和日志记录机制对于代码的安全性至关重要。

以下是一些建议:3.1 错误码检查:在调用可能返回错误码的函数后,应该始终检查其返回值,以及时处理异常情况。

3.2 异常处理:使用try-catch块或其他异常处理机制来捕获和处理可能发生的异常,以避免程序崩溃或信息泄漏。

3.3 日志记录:记录错误、警告和其他重要事件,以便及时排查问题并提供追踪。

4. 密码存储与加密在处理用户密码等敏感信息时,开发人员应特别注意其存储和传输的安全性。

以下是一些建议:4.1 密码加密:使用安全的加密算法对敏感信息进行加密,如SHA-256或AES。

4.2 密码哈希:对密码进行哈希处理,并采用适当的哈希算法,如bcrypt或PBKDF2,以防止密码泄露。

cert c 编码标准

cert c 编码标准

CERT C 编码标准============本文档旨在介绍CERT(C 语言编码标准)中的一些主要方面,包括文件排版、注释规范和变量声明和初始化等。

这些标准是用于编写安全、可维护和一致的C 语言代码的重要指南。

1. 文件排版-------* 文件名应采用小写字母和下划线的组合,以描述性的方式命名。

* 每个源代码文件应以`.c` 或`.h` 作为文件扩展名。

* 代码应按照模块化原则组织,将相关的函数和数据结构分组到头文件和源文件中。

* 在源文件中,函数和数据结构应按照逻辑关系进行排序,以便于阅读和维护。

* 每个源文件应以包含一个定义了函数和数据结构的头文件开始。

* 在每个源文件中,函数和数据结构应以清晰、易于阅读的格式进行排列。

* 在代码中,缩进应一致,以增强代码的可读性。

建议使用四个空格作为缩进单位。

* 行长度不应超过80个字符,以提高代码的可读性。

* 在函数之间应使用空行分隔,以增强代码的可读性。

2. 注释规范-------* 在源文件的顶部,应包含一个简短的注释,描述文件的作用和内容。

* 在每个函数之前,应添加一个注释块,描述函数的作用、输入参数和返回值。

* 在复杂的代码段之前,应添加注释说明代码的目的和实现方法。

* 对于全局变量和重要数据类型,应添加注释说明其作用和使用方法。

* 对于不常用的函数或数据结构,应添加注释说明其使用方法和实现细节。

* 对于代码中的重要决策点或特殊处理,应添加注释说明原因和实现细节。

* 对于可能产生副作用的函数调用,应添加注释说明其可能的影响和注意事项。

* 对于需要调试的代码段,应添加注释说明调试方法和可能的错误原因。

* 对于使用到的第三方库或工具,应添加注释说明其版本号、作用和使用方法。

* 对于可能存在的性能问题或潜在的优化点,应添加注释说明原因和解决方案。

3. 变量声明和初始化--------------* 在函数内部,变量应尽早声明和使用。

* 在函数内部,不应声明多个变量在同一行。

安富莱C语言编码规范

安富莱C语言编码规范

安富莱C语言编码规范1.1文件与目录(1)文件及目录的命名规定可用的字符集是[A-Z;a-z;0-9;._-]。

(2)源文件名后缀用小写字母 .c和.h。

(3)文件的命名要准确清晰地表达其内容,同时文件名应该精练,防止文件名过长而造成使用不便。

在文件名中可以适当地使用缩写。

以下提供两种命名方式以供参考:●各程序模块的文件命名开头2个小写字母代表本模块的功能:如:主控程序为mpMain.c,mpDisp.c …●不写模块功能标识:如:主控程序为Main.c,Disp.c …(4)一个软件包或一个逻辑组件的所有头文件和源文件建议放在一个单独的目录下,这样有利于查找并使用相关的文件,有利于简化一些编译工具的设置。

(5)对于整个项目需要的公共头文件,应存放在一个单独的目录下(例如:myProject/include)下,可避免其他编写人引用时目录太过分散的问题。

(6)对于源码文件中的段落安排,我们建议按如下的顺序排列:●文件头注释●防止重复引用头文件的设置●#include部分●#define部分●enum常量声明●类型声明和定义,包括struct、union、typedef等●全局变量声明●文件级变量声明●全局或文件级函数声明●函数实现。

按函数声明的顺序排列●文件尾注释(7)在引用头文件时,不要使用绝对路径。

如果使用绝对路径,当需要移动目录时,必须修改所有相关代码,繁琐且不安全;使用相对路径,当需要移动目录时,只需修改编译器的某个选项即可。

(8)在引用头文件时,使用<> 来引用预定义或者特定目录的头文件,使用“”来引用当前目录或(12)对于文件的长度没有非常严格的要求,但应尽量避免文件过长。

一般来说,文件长度应尽量保持在1000行之内。

1.2排版(1)程序块要采用缩进风格编写,缩进的空格数为4个。

(3)较长的语句或函数过程参数(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分(5)对齐使用TAB键,1个TAB对应4个字符位。

c语言的编码

c语言的编码

C语言的编码1. 什么是C语言C语言是一种通用的、面向过程的编程语言,由美国计算机科学家Dennis Ritchie 在20世纪70年代早期开发。

C语言是一种强类型的静态语言,它广泛应用于系统软件开发、嵌入式系统以及底层应用程序等领域。

相较于其他编程语言,C语言的编码效率高、运行速度快,因此备受开发者青睐。

2. C语言的编码规则在进行C语言的编码时,遵循一定的规则能够提高代码的可读性、可维护性,并减少出错的概率。

以下是C语言的一些编码规则:2.1 使用有意义的标识符在C语言中,标识符是用来表示变量、函数、类型等名称的字符序列。

为了增加代码的可读性,应使用有意义的标识符命名变量和函数,避免使用过于简单或过于复杂的命名方式。

同时,应遵循一定的命名规范,如使用驼峰命名法或下划线命名法。

2.2 使用适当的缩进和空格在编写C语言代码时,适当的缩进和空格能够增加代码的可读性,使代码块之间的逻辑结构更加清晰。

一般来说,建议使用4个空格进行缩进,并在运算符之间和逗号后面添加空格,以提高代码的可读性。

2.3 注释代码合理的注释能够帮助他人理解代码的逻辑,也方便自己在日后维护代码时的查找。

在编写C语言代码时,应使用合适的注释方式来解释代码的意图、算法思想等。

注释应尽可能准确、简洁,并与代码保持同步更新。

3. 如何优化C语言编码为了提高C语言代码的执行效率,优化编码是很重要的。

以下是一些常用的优化技巧:3.1 减少函数调用函数调用是一种开销较大的操作,频繁的函数调用会降低程序的执行效率。

因此,在编写C语言代码时,应尽量减少不必要的函数调用,将相关的代码逻辑放在同一个函数中。

3.2 使用合适的数据结构和算法选择合适的数据结构和算法是提高C语言代码效率的关键。

在处理大量数据或需要频繁查找的场景下,选择高效的数据结构和算法,如使用哈希表、二分查找等,能够有效降低时间复杂度,提高代码执行效率。

3.3 避免重复计算和内存浪费在编写C语言代码时,应避免进行重复的计算和内存浪费。

C语言编码规范

C语言编码规范

z if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。 if (a >= b && c > d)
USTB ROBOTEAM
C 语言编码规范
可读性
z I注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
说明:防止阅读程序时产生误解,防止因默认的优先级与设计思想不符而导致程序出错。 示例:下列语句中的表达式
Description: a short introduction of this module.
Revision History:
Date
Rel Ver. Noຫໍສະໝຸດ esmonth/day/year
x.x [e.g.] Module created
***********************************************************/
/* code two comments */ program code two
USTB ROBOTEAM
C 语言编码规范
6. 在代码的功能、意图层次上进行注释,提供有用、额外的信息。 说明:注释的目的是解释代码 的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注 释信息。 例如:如下注释意义不大。 /* if receive_flag is TRUE */ if (receive_flag) 而如下的注释则给出了额外有用的信息。 /* if mtp receive a message from links */ if (receive_flag)
word = (high << 8) | low (1)

c语言编程规范

c语言编程规范

c语言编程规范C语言是一种广泛使用的编程语言,为了使代码可读性强,易于维护,编写出高质量的C语言代码,需要遵守一些编程规范。

1. 命名规范:- 使用有意义的变量和函数名称,避免使用缩写或不明确的名称。

- 变量和函数名称使用小驼峰式命名,以单词首字母小写,后续的单词首字母大写。

- 宏常量使用全部大写字母,并用下划线分隔单词。

2. 注释规范:- 使用注释来解释代码的逻辑、功能或者算法,提高代码的可读性。

- 在函数开头可以用注释来描述函数的输入、输出及功能。

- 注释应该与代码对齐,避免过长或过短,同时避免注释代码。

3. 缩进和空格规范:- 使用合适的缩进,增加代码的可读性。

- 使用4个空格作为一次缩进,而不是使用Tab字符。

- 在运算符和逗号后加一个空格,使代码更易读。

- 在大括号前加一个空格,与控制流语句对齐。

4. 代码结构规范:- 将相关功能的代码块放在一起,便于阅读和维护。

- 逻辑层次清晰,函数和类方法要尽量短小,每个函数的功能单一、复用性强。

- 相关联的变量放在一起声明,并按照类型顺序排序。

- 避免过长的行,推荐每行代码不超过80个字符。

5. 错误处理规范:- 在代码中检查错误并进行适当的处理,避免代码崩溃或者产生不可预料的结果。

- 使用错误码或者异常来处理错误,避免使用魔法数字。

- 使用合适的方式记录错误信息,方便调试和定位问题。

6. 动态内存管理规范:- 在使用动态内存分配时,需要及时释放分配的资源,避免内存泄漏。

- 需要注意避免指针悬挂和使用已经释放的内存。

7. 注重效率和安全性:- 在编写代码时注重代码的性能和效率,避免使用低效的算法。

- 在处理用户输入或者系统API调用时,需要对输入进行有效性检查,避免安全漏洞。

8. 一致性和规范性:- 保持代码的一致性和规范性,遵循编程规范,方便团队协作和代码维护。

- 遵循公司或项目的编码规范,保持团队的代码风格一致。

以上是C语言编程规范的一些基本要点,通过遵守这些规范,可以提高代码的可读性、可维护性和代码质量,使得代码更加规范和高效。

c语言编码规范

c语言编码规范

c语言编码规范1. 定义要求(1)C语言编码规范是指以C语言为基础的各大编程规范,它包含了C语言编写编程风格,命名规范,编程结构规范,编程语句规范等,让C语言编程更加规范、整洁。

2. 风格规范(1)关键字需大写书写,函数名、变量名等由于字母的组合,需要全部小写,每个单词首字母大写;(2)变量名不同部分用下划线相隔,如count_day;(3)变量名、宏定义尽量以字母为主,如类似变量temp1,应以temp_num或tmp_num标出;(4)如果是boolean变量,用is_,has_,can_,should_等来开头;(5)结构体变量名以st_开头,指针变量以p_开头;(6)变量命名规避使用数字或关键字作为变量名,变量有一定的含义。

3.命名规则(1)变量名称需要清晰容易识别,最大限度的体现变量定义的含义;(2)动词开头的函数名,如GetValue();(3)禁止使用拼音代替英文原语的单词,如使用Genarate代替Generate;(4)宏定义加上宏定义的作用,方便查阅,如#define MAX_NUM 10;4.编码规范(1)大括号{}要和函数声明、if语句、循环等放在同一行,同一行必须以分号结束;(2)避免使用复杂的表达式,尽量简化表达式,提高程序执行效率;(3)函数的入口参数必须在一行完成,不允许一行就只声明一个参数;(4)使用空行表示程序模块,增加程序可读性;(5)赋值操作、声明操作分开,以便于断点调试及阅读。

5.注释规范(1)注释需要给出功能说明、操作提示等,不只是单纯的注释源码,使代码更易理解;(2)代码块开头加一个注释表明代码块作用,方便阅读;(3)函数声明后增加功能注释,注释必须完整,包括函数的功能简介,参数说明,返回值等;(4)注释中禁止出现脏话、宗教意象、广告语等。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C语言编程规范对于程序员来说,能工作的代码并不等于“好”的代码。

“好”代码的指标很多,包括易读、易维护、易移植和可靠等。

其中,可靠性对嵌入式系统非常重要,尤其是在那些对安全性要求很高的系统中,如飞行器、汽车和工业控制中。

这些系统的特点是:只要工作稍有偏差,就有可能造成重大损失或者人员伤亡。

一个不容易出错的系统,除了要有很好的硬件设计(如电磁兼容性),还要有很健壮或者说“安全”的程序。

然而,很少有程序员知道什么样的程序是安全的程序。

很多程序只是表面上可以干活,还存在着大量的隐患。

当然,这其中也有C语言自身的原因。

因为C语言是一门难以掌握的语言,其灵活的编程方式和语法规则对于一个新手来说很可能会成为机关重重的陷阱。

同时,C语言的定义还并不完全,即使是国际通用的C语言标准,也还存在着很多未完全定义的地方。

要求所有的嵌入式程序员都成为C语言专家,避开所有可能带来危险的编程方式,是不现实的。

最好的方法是有一个针对安全性的C语言编程规范,告诉程序员该如何做。

本规范在制定过程中,主要参考了业界比较推崇的《华为软件编程规范和范例》和《MI SRA 2004规则》,适合C语言初学者使用,目的在于在教学中培养学生良好的编程规范和意识、素质,促进所设计程序安全、健壮、可靠、可读与可维护(程序简单、清晰)。

考虑到面向的是初学者,为便于教学和课程考核操作,本规范中的要求比较基本。

事实上,很多公司都有自己规定的代码风格,包括命名规则、缩进规则等,学生参加工作后,应再进一步学习和应用公司的规范。

建议学生在学习本规范的同时,花点时间阅读本规范的参考文献原文,特别是熟读本规范的参考文献之一的《“安全第一”的C语言编程规范》,深刻理解编程规范与程序安全、健壮、可靠、可读、可维护间的关系和作用,在学习和工作中养成良好的编程风格。

1 排版1.1 严格采用阶梯层次组织程序代码函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case 语句下的情况处理语句也要遵从语句缩进要求。

程序块的分界符(如C/C++ 语言的大括号‘{’和‘}’)应各独占一行并且位于同一列,同时与引用它们的语句左对齐。

在函数体的开始、类的定义、结构的定义、枚举的定义以及if 、for 、do 、while 、switch 、case 语句中的程序都要采用如上的缩进方式。

各层次缩进的风格采用TAB缩进(TAB宽度原则上使用系统默认值,TC使用8空格宽度,VC使用4空格宽度)。

示例:if (x is true){we do y}else{if (a > b){...}else{...}}和:if (x == y){...}else if (x > y){...}else{....}注意,右括号所在的行不应当有其它东西,除非跟随着一个条件判断。

也就是do-while 语句中的“while”,象这样:do{body of do-loop} while (condition);说明:代码离不开缩进,缩进背后的思想是:清楚地定义一个控制块从哪里开始,到哪里结束。

尤其是在你连续不断的盯了20个小时的屏幕后,如果你有大尺寸的缩进。

你将更容易发现缩进的好处。

关于缩进主要有两个争论,一个是该用空格(Space)还是用制表符(Tab),另外一个是该用4格缩进还是8格缩进甚至都不是。

建议总是使用Tab缩进,因为几乎所有的代码(不仅仅是C代码)都在使用Tab缩进。

现在,有些人说8个字符大小的缩进导致代码太偏右了,并且在一个80字符宽的终端屏幕上看着很不舒服。

对这个问题的回答是:如果你有超过3个级别的缩进,你就有点犯糊涂了,应当修改你的程序。

简而言之,8个字符的缩进使程序更易读,而且当你把功能隐藏的太深时,多层次的缩进还会对此很直观的给出警告。

要留心这种警告信息。

例外:对于由开发工具自动生成的代码可以有不一致。

1.2 及时折行较长的语句(>80 字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进(至少1个TAB位置),使排版整齐,语句可读。

示例:report_or_not_flag = ((taskno < MAX_ACT_TASK_NUMBER)&& (n7stat_stat_item_valid (stat_item))&& (act_task_table[taskno].result_data != 0));循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。

示例:if ((taskno < max_act_task_number)&& (n7stat_stat_item_valid (stat_item))){... // program code}for (i = 0, j = 0; (i < BufferKeyword[word_index].word_length)&& (j < NewKeyword.word_length); i++, j++){... // program code}for (i = 0, j = 0;(i < first_word_length) && (j < second_word_length);i++, j++){... // program code}若函数或过程中的参数较长,则要进行适当的划分。

示例:n7stat_str_compare((BYTE *) & stat_object,(BYTE *) & (act_task_table[taskno].stat_object),sizeof (_STAT_OBJECT));n7stat_flash_act_duration( stat_item, frame_id *STAT_TASK_CHECK_NUMBER+ index, stat_object );1.3 一行只写一条语句不允许把多个短语句写在一行中,即一行只写一条语句。

示例,如下例子不符合规范:rect.length = 0; rect.width = 0;应如下书写rect.length = 0;rect.width = 0;1.4 if、for、do、while等语句格式规定if 、for 、do 、while 、case 、switch 、default 等语句自占一行,且if 、for 、do 、w hile 等语句的执行语句部分无论多少都要加花括号{}。

1.5 空行(1)变量说明之后必须加空行。

(2)相对独立的程序块之间应加空行。

1.6 空格在两个以上的关键字、变量、常量进行对等操作时,它们之间的操作符之前、之后或者前后要加空格;进行非对等操作时,如果是关系密切的立即操作符(如-> ),后不应加空格。

采用这种松散方式编写代码的目的是使代码更加清晰。

由于留空格所产生的清晰性是相对的,所以,在已经非常清晰的语句中没有必要再留空格,如果语句已足够清晰则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为在C/C++语言中括号已经是最清晰的标志了。

在长语句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部不加空格。

给操作符留空格时不要连续留两个以上空格。

(1)逗号、分号只在后面加空格。

int a, b, c;(2)比较操作符, 赋值操作符"="、"+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。

if (current_time >= MAX_TIME_VALUE){a =b + c;}a *= 2;a =b ^ 2;(3)"!"、"~"、"++"、"--"、"&"(地址运算符)等单目操作符前后不加空格。

*p = 'a'; // 内容操作"*"与内容之间flag = !isEmpty; // 非操作"!"与内容之间p = &mem; // 地址操作"&" 与内容之间i++; // "++","--"与内容之间(4)"->"、"."前后不加空格。

p->id = pid; // "->"指针前后不加空格(5) if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。

if (a >= b && c > d)1.7 对变量的定义,尽量位于函数的开始位置(1)应避免分散定义变量。

(2)同一行内不要定义过多变量。

(3)同一类的变量在同一行内定义,或者在相邻行定义。

(4)数组、指针等复杂类型的定义放在定义区的最后。

(5)变量定义区不做较复杂的变量赋值。

1.8 程序各部分的放置顺序在较小的项目中,按如下顺序组织安排程序各部分:(1)#include <C的标准头文件>。

(2)#include 〞用户自定义的文件〞。

(3)#define 宏定义。

(4)全局变量定义。

(5)函数原型声明。

(6)main函数定义。

(7)用户自定义函数。

以上各部分之间、用户自定义的函数之间应加空行。

注意,函数原型声明统一集中放在main函数之前,不放在某个函数内部。

2 注释2.1 注释的原则和目的注释的原则是有助于对程序的阅读理解,在该加的地方都加了,注释不宜太多也不能太少,注释语言必须准确、易懂、简洁。

通过对函数或过程、变量、结构等正确的命名以及合理地组织代码的结构,使代码成为自注释的——清晰准确的函数、变量等的命名,可增加代码可读性,并减少不必要的注释——过量的注释则是有害的。

注释的目的是解释代码的目的、功能和采用的方法,提供代码以外的信息,帮助读者理解代码,防止没必要的重复注释信息。

示例:如下注释意义不大。

/* if receive_flag is TRUE */if (receive_flag)而如下的注释则给出了额外有用的信息。

相关文档
最新文档