代码规范说明.docx
《代码规范说明.docx》由会员分享,可在线阅读,更多相关《代码规范说明.docx(17页珍藏版)》请在冰豆网上搜索。
![代码规范说明.docx](https://file1.bdocx.com/fileroot1/2022-12/14/121702cf-3f66-477c-8900-fda3501ec897/121702cf-3f66-477c-8900-fda3501ec8971.gif)
代码规范说明
代码开发规
对于新增代码或者修改的代码应按代码规要求进行编写。
一、通用规
1.1Kconfig文件:
格式:
注释部分以#开头,空一格开始写注释容。
一级容“config”顶头开始
二级容开头空白处为一个制表符,相当于8个空格
三级容开头空白处为一个制表符再加两个空格,即比二级容缩进两个空格
容:
help说明部分必须有,为第三级容,需说明帮助信息,分段的容需空一行,每块config间空一行。
以文件系统fs下的Kconfig示例如下图1.1,‘□’代表一个空格,短横线‘-’所占一行代表一个空行:
图1.1
#
#□Filesystemconfiguration
#
----------------------------------------------------------------
menu"Filesystems"
----------------------------------------------------------------
configEXT2_FS
□□□□□□□□tristate"Secondextendedfssupport"
□□□□□□□□help
□□□□□□□□□□Ext2isastandardLinuxfilesystemforharddisks.
□□□□□□□□□□Tocompilethisfilesystemsupportasamodule,choose□□□□□□□□□□Mhere:
themodulewillbecalledext2.Beaware□□□□□□□□□□howeverthatthefilesystemofyourrootpartition□□□□□□□□□□(theonecontainingthedirectory/)cannotbecompiled□□□□□□□□□□asamodule,andsothiscouldbedangerous.
----------------------------------------------------------------
□□□□□□□□□□Ifunsure,sayY.
-----------------------------------------------------------------
configEXT2_FS_XATTR
□□□□□□□□bool"Ext2extendedattributes"
□□□□□□□□dependsonEXT2_FS
□□□□□□□□help
□□□□□□□□□□Extendedattributesarename:
valuepairsassociated
□□□□□□□□□□withinodesbythekernelorbyusers(seetheattr(5)□□□□□□□□□□manualpage,orvisitfor□□□□□□□□□□details).
-----------------------------------------------------------------
□□□□□□□□□□Ifunsure,sayN.
1.2头文件.h和.c文件规说明
格式:
制表符宽度相当于8个空格
1.2.1文件首部注释
文件首部的注释用于说明文件信息,可选项目包括:
文件所属模块
主要函数实现
作者信息
信息
软件说明
以上容为可选信息,一个文件中不一定包含全部信息,由开发者根据重要性来确定。
注释格式必须是块注释形式,即:
以/*行开头,以*/行结束,中间每一行前面均加一个*,每行的*号在竖直方向是对齐排列的,容部分距离行首的距离为4个字符,每段容间空一行;作者信息部分若有多个作者,则每个作者单列一行,并与其他作者信息对齐;信息按时间段可分行说明,保持部对齐。
示例如下图1.2,其中方框'□'代表一个空格:
图1.2
/*
□*□□NSASecurity-EnhancedLinux(SELinux)securitymodule
*
□*□□ThisfilecontainstheSELinuxhookfunctionimplementations.
*
□*□□Authors:
StephenSmalley,
*ChrisVance,
*
□*□□Copyright(C)2001,2002NetworksAssociatesTechnology,Inc.
□*□□Copyright(C)2004-2005TrustedComputerSolutions,Inc.
□*
*
□*□□Thisprogramisfreesoftware;youcanredistributeitand/or
□*□□modifyitunderthetermsoftheGNUGeneralPublicLicense
□*□□version2,aspublishedbytheFreeSoftwareFoundation.
□*/
1.2.2代码注释
新增或修改的代码重要部分可以添加注释。
代码注释统一用’/*’和’*/’整块注释,注释容与’*’间用空格隔开,若注释是多行,则采用类似首部注释的格式,每行注释前面都有一个’*’。
(1)函数定义注释
注释可选项目:
函数说明/参数信息/返回值信息/使用信息
对一个函数的注释,每项初始位置缩进要一致;可以缩进一个空格的或几个空格,核代码一般缩进一个制表符。
注释项分段时段与段间空一行,如下图所示为函数iunique的注释,‘□’代表空格:
图1.3
/**
□*□□□□□□remove_inode_hash-removeaninodefromthehash
□*□□□□□□inode:
inodetounhash
□*
□*□□□□□□Removeaninodefromthesuperblock.
□*/
voidremove_inode_hash(structinode*inode)
{……}
图1.4
/*
□*□>0ifthefileisinuse
□*□=0ifthefileisnotinuse
□*□<0onfailure
□*/
asmlinkagelongsys_fcount(intop,void__user*data)
{……}
(2)代码块及单语句注释
对整块代码进行的注释放在整块代码前面,如对函数说明注释放在函数定义前面一行;注释与被注释代码的缩进保持一致;对单独一条语句的注释可以放在语句后面,同一性质的注释最好保持对齐。
图1.5
#include/*forUnixsockettypes*/
……
图1.6
if(dname_external(dentry)){
□□□□□□□□/*
□□□□□□□□*Bothexternal:
swapthepointers
□□□□□□□□*/
□□□□□□□□do_switch(target->d_name.name,dentry->d_name.name);
}else{
□□□□□□□□/*
□□□□□□□□*dentry:
internal,target:
external.Stealtarget's
□□□□□□□□*storageandmaketargetinternal.
□□□□□□□□*/
□□□□□□□□dentry->d_name.name=target->d_name.name;
□□□□□□□□target->d_name.name=target->d_iname;
}
1.2.3代码格式
空行:
代码块与代码块间至少空一行,同一类型的代码在不影响功能的情况下最好放在一块。
如include语句,包含库文件中的头文件放在一起,包含非库文件的头文件放在一起,两部分中间空一行;不同函数定义间空一行。
在函数,简单变量声明放在一起,与其他语句间空行,复杂的变量如结构体、枚举类型的定义须占用多行时,单独作为一块,后面空一行;一般if语句、while语句、for语句等这些基本c语言语句类型后空一行,这些语句中嵌套的语句建议后面也空一行。
goto语句到达的代码块,代码块名称顶头开始。
缩进:
第一级代码顶头开始,处于同一级的代码缩进保持一致。
后一级别的代码比前一级别的代码缩进一个制表符。
函数定义中参数分行列举时,后面的行应与第一个参数保持对齐;函数调用时出现参数需列多行的,也应与第一个参数保持对齐。
数组、结构体、枚举类型等占用多行时缩进一个制表符。
if、while、for、switch等语句的左花括号’{’,与圆括号语句在同一行,与’)’用一个空格隔开,不再另起一行。
空格:
双目运算符前后空一格;函数多个参数用逗号隔开后空一格
if、for、while、switch等基本语句中,关键词与左括号’(’间、右括号’)’与’{’间有一个空格。
图1.7
for□(p□=□p2;□p->d_parent□!
=□p;□p□=□p->d_parent)□{
if□(p->d_parent□==□p1)
return1;
}
二、kernel相关代码规
参照一通用规
部分的.h和.c文件规说明
三、glibc相关代码规
3.1头文件.h文件和.c文件规
3.1.1文件首部注释
与通用规1.2.1的差异在于:
模块注释的中间行不需每行前面有*号,且注释容的缩进为三个空格(距离行首)。
此代码库中,文件首部注释部分除了对各个文件简单说明外,其他如软件信息基本不变。
图3.1
/*□Copyright(C)1995,1997,1998,2000FreeSoftwareFoundation,
□□□Inc.
ThisfileispartoftheGNUCLibrary.
Contributedby
□□□UlrichDrepper,August1995.
□□□TheGNUCLibraryisfreesoftware;youcanredistributeit
□□□and/or
modifyitunderthetermsoftheGNULesserGeneral
□□□Public
LicenseaspublishedbytheFreeSoftwareFoundation;
□□□either
version2.1oftheLicense,or(atyouroption)any
□□□laterversion.
□□□TheGNUCLibraryisdistributedinthehopethatitwillbe
□□□useful,
butWITHOUTANYWARRANTY;withouteventheimplied
□□□warrantyof
MERCHANTABILITYorFITNESSFORAPARTICULAR
□□□PURPOSE.SeetheGNU
LesserGeneralPublicLicenseformore
□□□details.
□□□YoushouldhavereceivedacopyoftheGNULesserGeneral
□□□Public
LicensealongwiththeGNUCLibrary;ifnot,writeto
□□□theFree
SoftwareFoundation,Inc.,59TemplePlace,Suite
□□□330,Boston,MA
02111-1307USA.*/
3.1.2代码注释
(1)函数定义注释
函数定义注释与首部注释格式相同,此库中对函数定义的注释较少,注释项目可参考通用规1.2.2中
(1)所述。
注意:
此库中函数定义格式与通用格式有不同,将返回值类型单独列在了函数名前面行,如下图所示。
图3.2
(2)代码块及单语句注释
与通用规1.2.2中
(2)的风格一致,缩进不同处见下面的代码格式。
3.1.3代码格式
代码格式与通用规1.2.3中所不同的地方在于:
下一级代码相对于上一级代码的缩进是两个空格,if,while,for等语句的左花括号‘{’另起一行缩进,如上图中所示。
/*□Callkernelwithadditionaltwoargumentsthesyscall
□□□requires.*/
int
reboot(inthowto)
{
□□return;
}
if□(k_dev□!
=□dev)
□□{
□□□□__set_errno(EINVAL);
□□□□return-1;
□□}
四、bibautil库代码规
参照通用规
五、procps库代码规
procps源码本身有些地方的风格不一,新增和修改部分进行风格统一。
5.1头文件.h和.c文件规说明
5.1.1文件首部注释
文件首部注释部分与通用规1.2.1的主要差别在于每行注释容与行首星号*间只有一个空格。
5.1.2代码注释
(1)函数定义注释
此库中对函数定义的注释较少,风格不一,现对于新增代码的函数定义注释统一参考通用规1.2.2中
(1)所述。
注意:
此库中函数的所有‘{’都未单独一行开始,直接跟在语句后面。
如下图所示:
图5.1
staticintcompare_two_procs(constvoid*a,constvoid*b){
□□sort_node*tmp_list=sort_list;
□□while(tmp_list){
□□□□intresult;
□□□□result=(*tmp_list->sr)(*(constproc_t*const*)a,*(const
proc_t*const*)b);
□□□□if(result)return(tmp_list->reverse)?
-result:
result;
□□□□tmp_list=tmp_list->next;
□□}
□□return0;/*noconclusion*/
}
(2)代码块及单语句注释
新增代码统一规定与通用规1.2.2中
(2)的风格一致,缩进不同处见下面的代码格式。
(3)代码格式
代码格式与通用规1.2.3中所不同的地方在于:
下一级代码相对于上一级代码的缩进是两个空格,如上图中所示。
六、pam代码库规说明
pam代码库源码风格也不一致,新增或者修改的代码建议与修改处的源码风格保持一致;全新增加的代码参考下面规。
6.1头文件.h和.c文件规说明
6.1.1文件首部注释
参考通用规1.2.1,文件首部注释部分与通用规1.2.1的主要差别在于每行注释容与行首星号*间不是八个空格而是一个空格。
6.1.2代码注释
(1)函数定义注释
参考通用规1.2.2中
(1)函数定义注释,主要差别同样在于每行注释容与行首星号*间不是八个空格而是一个空格。
(2)代码块和单语句注释
参考通用规1.2.2中
(2),
(3)代码格式
参考通用规1.2.3,主要差别在于缩进大小不一定是一个制表符,与上下文保持一致,若无参考上下文则统一缩进四个空格。
七、audit-module代码库规说明
audit-module代码库中.c和.h文件在缩进方面采用缩进一个制表符的风格很统一,在注释容,空行与空格这类格式上可以参考通用规1.2。
Audit-module代码库中.l文件和.y文件函数定义注释以及代码块注释容和格式可以参考通用规1.2;.l文件中token标记对应的操作(即花括号的代码)应根据容调整对齐。
八、coreutils代码库规说明
参考三glibc相关代码规
九、xen代码库规说明
十、policycoreutils代码库规说明
参考一通用规
十一、acl代码库规说明
参考一通用规
文件首部注释与通用规1.2.1的差异在于:
模块注释的中间行不需每行前面有*号,且注释容的缩进为两个空格(距离行首)。
图11.1
/*
□□File:
parse.c
□□(LinuxAccessControlListManagement)
□□Copyright(C)1999,2000
□□AndreasGruenbacher,
□□Thisprogramisfreesoftware;youcanredistributeitand/or
□□modifyitunderthetermsoftheGNULesserGeneralPublic
□□LicenseaspublishedbytheFreeSoftwareFoundation;either
□□version2oftheLicense,or(atyouroption)anylater
□□version.
□□Thisprogramisdistributedinthehopethatitwillbeuseful,
□□butWITHOUTANYWARRANTY;withouteventheimpliedwarrantyof
□□MERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.Seethe□□GNU
LesserGeneralPublicLicenseformoredetails.
□□YoushouldhavereceivedacopyoftheGNULesserGeneral
□□Public
Licensealongwiththislibrary;ifnot,writetothe
□□FreeSoftware
Foundation,Inc.,59TemplePlace-Suite330,
□□Boston,MA02111-1307,USA.
□□*/
另一个差异在于函数定义时的返回值类型位置,应该参照图3.2中返回值类型格式。
十二、audit代码库规说明
参考一通用规,差异之处在于:
文件首部注释应该将图1.2中两个空格变为一个空格,函数定义注释应将图1.3中注释行八个空格变为一个空格。
十三、openssh代码库规说明
参考一通用规,差异之处在于:
文件首部注释部分应将图1.2中两个空格变为一个空格,函数定义注释部分也将图1.3中注释行八个空格变为一个空格,函数返回值类型格式应参照图3.2中返回值类型格式
十四、shadow-utils代码库规说明
参考十二规说明
十五、smartcard代码库规说明
代码未修改
十六、epass2000代码库规说明
参考十二规说明
十七、zhongwei.linux代码库规说明
参考一通用规,差异之处在于:
文件首部注释应该将图1.2中两个空格变为一个空格,函数定义注释应将图1.3中注释行八个空格变为一个空格。
十八、yzw.anaconda代码库规说明
参考一通用规,差异之处在于:
缩进为四个空格。
有效代码库:
代码库所在目录:
/var/backup/serveroot/public-repo
其下四个子目录:
apps,kernel,policy,services
apps中有效代码库:
liping.openssh.git
liping.shadow-utils.git
liping.smartcard.git
liping.epass2000.git
suxingwang.biba-utils.git
zhangyanping.procps.git
liuyan.nfsark-policy.git
yongbo.coreutils.git
yongbo.policycoreutils.git
yongbo.acl.git
yzw.anaconda.git
kernel中有效代码库:
yongbo.xen.git
zhongwei.linux.git
merged.linux.git
注:
merged.linux.git由wushu.linux.gityongbo.linux.git合并而成
policy中有效代码库:
暂无
services中有效代码库:
liping.glibc.git
yongbo.audit.git
代码库具体到开发人员:
liping:
apps:
liping.openssh.git
liping.shadow-utils.git
liping.smartcard.git
liping.epass2000.git
services:
liping.glibc.git
注:
shadow里面主要是useradd\usermod\userdel,smartcard未作修改。
shiwei:
apps:
shiwei.pam.git
shiwei.audit-module.git
services:
无
yongbo:
apps:
yongbo.coreutils.git
yongbo.policycoreutils.git
yongbo.acl.git
services:
yongbo.audit.git
kernel:
yongbo.xen.git
suxingwang:
apps:
suxingwang.biba-utils.git
zhangyanping:
apps:
zhangyanping.procps.git
liuyan:
apps:
liuyan.nfsark-policy.git
zhongwei:
apps:
yzw.anaconda.git
kernel:
zhongwei.linux.git
wushu:
apps:
wushu.bibautils.git
wushu.initscripts.git
wushu.sysvinit.git
wushu.util-linux.git
kernel:
merged.linux.git
services:
wushu.cups.git