秋阳的软件测试专栏

   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  65 随笔 :: 0 文章 :: 127 评论 :: 0 Trackbacks

1 前言

本文挡描述了在Logiscope——Rulechecker规则集中,可定制编码规则的定制方法。对于这些编码规则的解释说明,可参见《RuleChecker编码规范全文》。

2 可定制编码规则集

Rulechecker规则集中可定制的编码规则共有30条。通过设置,可以使这些规则更好的适应我们的实际要求。下面逐条对可定制编码规则的定制方法进行介绍。

2.1 ansi 函数的声明和定义要遵守ANSI规定的格式

RuleChecker中,默认情况下,参数 name void 同时生效,如下所示:

STANDARD ansi ON LIST "name" "void" END LIST END STANDARD

如果只需要检测是否指定了函数参数列表中参数的类型和名称,则只放置参数 name,如下所示:

STANDARD ansi ON LIST "name" END LIST END STANDARD

如果只是要求函数参数列表中不能为空,则只放置参数void,如下所示:

STANDARD ansi ON LIST "void" END LIST END STANDARD

2.2 cmclass 一个源文件只对应一个类

源文件类型用CODE来表示,对应于后缀*.cc, *.cxx, *.cpp, *.C or *.c,详细定义如下(注意第三行):

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD cmclass ON LIST "CODE" END LIST END STANDARD

这是RuleChecker为我们做的默认设置,表示认为以*.cc, *.cxx, *.cpp, *.C or *.c为后缀的文件为源文件,检查这些文件中定义的所有函数是否只属于同一个类。

如果不适合我们的程序,我们可以改变参数的设置,比如我们只是将以.Cpp为后缀的文件作为源文件,就可以做如下的设置:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cpp" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD cmclass ON LIST "CODE" END LIST END STANDARD

我们甚至可以添加一个新的文件类型来代替原有的CODE,比如我们添加一个叫做MY_CODE的文件类型,如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "MY_CODE" "*.C" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD cmclass ON LIST "MY_CODE" END LIST END STANDARD

现在就只是MY_CODE起作用了。

2.3 cmdef 源文件中不要有类的声明

源文件类型用CODE来表示,对应于后缀*.cc, *.cxx, *.cpp, *.C or *.c,详细定义如下(注意第三行):

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD cmdef ON LIST "CODE" END LIST END STANDARD

这是RuleChecker为我们做的默认设置,表示认为以*.cc, *.cxx, *.cpp, *.C or *.c为后缀的文件为源文件,检查这些文件中是否包含类的声明。

如果不适合我们的程序,我们可以改变参数的设置,比如我们只是将以.Cpp为后缀的文件作为源文件,就可以做如下的设置:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.CC" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD cmdef ON LIST "CODE" END LIST END STANDARD

我们甚至可以添加一个新的文件类型来代替原有的CODE,比如我们添加一个叫做MY_CODE的文件类型,如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "MY_CODE" "*.CC" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD cmdef ON LIST "MY_CODE" END LIST END STANDARD

现在就只是MY_CODE起作用了。

2.4 const 使用常量

默认情况下,RuleChecker只允许程序中直接出现下面这四个数字和字符串量,它们分别是:""(空字符串), " "(只包含一个空格的字符串), "0"(数字0)和 "1"(数字1),如下:

STANDARD const ON LIST """""" """ """ "0" "1" END LIST END STANDARD

我们可以做如下的设置:

 STANDARD const ON LIST """""" """ """ "0" "hello" END LIST END STANDARD

这样设置后,RuleChecker只允许程序中直接出现下面这四个数字和字符串量,它们分别是:""(空字符串), " "(只包含一个空格的字符串), "0"(数字0)和 " hello "(字符串hello

2.5 constrcpy 关于拷贝构造函数

RuleChecker的默认情况下,参数"dynalloc"是不被设置的,如下:

STANDARD constrcpy ON END STANDARD

此时,类中必须要显示定义拷贝构造函数。

如果仅在当类中包含指针类型的数据成员时,才要求类显示定义拷贝构造函数,那么按如下的方法设置:

STANDARD constrcpy ON "dynalloc" END STANDARD

2.6 convnewdel Adhere to Convention when Writing "new" and

"delete" Operators

By default the "static" parameter is not put:

STANDARD convnewdel ON END STANDARD

To declare static new and delete operators :

STANDARD convnewdel ON "static" END STANDARD

2.7 dmaccess 类数据成员的访问控制

该条规则的参数是public、protected、privatr这三个字符串。通过指定相应的字符串,RuleChecker就会禁止类中声明与之相对应的数据成员。

RuleChecker默认情况下,只检查类中是否声明了Public数据成员,如果有,则视为违反了该条规则。设置如下:

STANDARD dmaccess ON LIST "public" END LIST END STANDARD

如果要禁止类中声明Public、protected的数据成员,则可以按如下方式进行设置:

STANDARD dmaccess ON LIST "public" "protected" END LIST END STANDARD

2.8 exprcplx 表达式的复杂性

参数是一个数字,用来指定表达式复杂性的最大可接受程度。表达式的复杂性通过一个叫做关联语法树(associated syntactictree)的指标来衡量,它的计算方法为:表达式中操作符的数量加上操作数的数量再加1。

RuleChecker默认情况下,表达式复杂性的上限被设定为13。如下:

STANDARD exprcplx ON MINMAX 0 13 END STANDARD

如果设置成这样:

STANDARD exprcplx ON MINMAX 0 16 END STANDARD

则表达式复杂性的上限被设定为16。

2.9 exprparenth 在表达式中使用括号

RuleChecker默认情况下,参数partpar被设置。如下:

STANDARD exprparenth ON "partpar" END STANDARD

要按照最严格的要求检测代码,则按如下方式设置:

STANDARD exprparenth ON END STANDARD

2.10 funcres 设置禁止使用的函数

RuleChecker默认情况下,程序中不禁用任何的函数名。如下所示:

STANDARD funcres ON LIST END LIST END STANDARD

如果我们设置成这样:

STANDARD funcres ON LIST "system" "malloc" END LIST END STANDARD

RuleChecker检查以system、malloc为函数名的函数,如果存在,则做为错误予以报告。

2.11 goto 禁用Goto语句

RuleChecker默认情况下,出现在程序任何地方的goto语句都是被禁止的。如下所示:

STANDARD goto ON LIST END LIST END STANDARD

通过设置参数,可以允许某些通过goto跳转到指定语句行的语句出现,比如,通过下面的设置:

STANDARD goto ON LIST "ok" "error" END LIST END STANDARD

RuleChecker允许程序中出现 goto ok; goto error;这样的语句。

2.12 Headercom 对于文件注释的要求

RuleChecker中,我们可以要求每个代码文件的头部必须有文件注释,并且可以规定这个注释的具体格式。注释的格式是通过一系列的字符串表达式来设定的。表达式中用到了一些特殊字符,这些字符去自Posix 1003.2 号标准。

规定注释格式的字符串表达式由一个或多个非空的子字符串组成,它们之间通过字符“|”连接。每一个子字符串又是由一个或多个子表达式组成。在每个子表达式中可包含如下的通配符:

*  —— 代替0个或多个任意字符;

+  —— 代替1个或多个任意字符;

?  —— 代替0个或1个任意字符;

{i} —— 代替大于等于 i 个任意字符;

{i,j}—— 代替 i 到 j 个任意字符;

. —— 代替1个任意字符;

还可包含:

^ —— 表示一个字符串的开始

$ —— 表示一个字串符的结束

一个子表达式可以用“()”括起,也可以被下面的符号括起:

[...] —— 当子表达式被[...]括起时,则该子表达式只能由在[...]中列出的某一个字符组成;

[^...] —— 当子表达式被[^...]括起时,则该子表达式为一个不在[^...]中列出的任意字符;

对于[...]和[^...],如果在其包含的列表中,用“-”将两个字符隔开,则表示可以取那两个字符之间的任意一个字符,比如,[0-9] 表示0至9之间的任意数字,[a-d] 表示a至d之间的任意字符。

要想了解更详细的信息,请参阅Posix 1003.2 号标准中的相关内容。

下面举几个例子:

比如我们设定一个子表达式的格式为".+_Ptr",则符合要求的字符串可以是:"abc_Ptr", "hh_Ptr",象"_Ptr"这样的形式是不行的;

如果我们设定一个子表达式的格式为"T[a-z]*" ,则符合要求的字符串可以是:"Ta", "Tb", "Tz";再比如我们设定一个子表达式的格式为"[A-Z][a-z0-9_]*",则符合要求的字符串可以是:"B1", "Z0", "Pp", “P_1_a”。

RuleChecker默认情况下,文件注释中必须包括:文件名、开发者、开发日期、功能简介这四部分。RuleChecker的默认设置如下:

STANDARD Headercom ON

LIST "HEADER"   "Name: [a-z]*"

"Author: [A-Z][a-z]*"

"Date: [0-9][0-9]/[0-9][0-9]/[0-9][0-9]"

"Remarks:"

END LIST

LIST "CODE"     "Name: [a-z]*"

"Author: [A-Z][a-z]*"

"Date: [0-9][0-9]/[0-9][0-9]/[0-9][0-9]"

"Remarks:"

END LIST

END STANDARD

其中,第一部分规定的是头文件的文件注释格式,第二部分规定的是实现文件的文件注释格式。在代码文件中,如下的注释格式就是符合上面的规定的:

////////////////////////////////////////////////

// Name: program

// Author: Andrieu

// Date: 08/07/96

// Remarks: example of comments

////////////////////////////////////////////////

如果我们将规则设置如下:

STANDARD Headercom ON

LIST "HEADER"   "【文件名】"

                "【功能模块和目的】"

                "【主要函数及其功能】"

                "【主要算法】"

                "【接口说明】"

                "【版本】"

END LIST

LIST "CODE"     "【文件名】"

                "【功能模块和目的】"

                "【主要函数及其功能】"

                "【主要算法】"

                "【接口说明】"

                 "【版本】"

END LIST

END STANDARD

则在代码文件中,下面的注释格式就是符合要求的:

/**********************************************

//【文件名】:draw.h

//【功能模块和目的】:显示图形。

//【主要函数及其功能】:fun1(),fun2()

//【主要算法】:a,b,c

//【接口说明】d,e,f

//【版本】:1.0.1

*************************************************/

2.13 headercom 函数、类的注释

RuleChecker中,我们可以要求每个类、函数必须有注释,并且可以规定这个注释的具体格式。

RuleChecker提供了六个关键字,其意义分别如下:

func_glob_def—— 定义全局函数的地方

func_glob_decl—— 声明全局函数的地方

func_stat_def—— 定义静态函数的地方

func_stat_decl—— 声明静态函数的地方

class—— 声明类的地方

标识符的格式是通过一个字符表达式来设置的,具体的设置方法请参见Headercom中的相关描述。

RuleChecker默认情况下,在函数或类之前必须有以“//”开头的注释,注释内容不限,如下:

STANDARD headercom ON

LIST "class" "///*" END LIST

LIST "func_glob_def" "///*" END LIST

LIST "func_glob_decl" "///*" END LIST

LIST "func_stat_def" "///*" END LIST

LIST "func_stat_decl" "///*" END LIST

END STANDARD

下面是另一种设置的情况:

STANDARD headercom ON

LIST "class"                "Name of the class:"

"Filename:"

END LIST

LIST "func_glob_def"        "Definition of the extern function:"

"Author: [A-Z][a-z]*"

END LIST

LIST "func_glob_decl"   "Declaration of the extern funciton:"

"Date: [0-9][0-9]/[0-9][0-9]/[0-9][0-9]"

END LIST

LIST "func_stat_def"        "Definition of the static function:"

"Remarks:"

END LIST

LIST "func_stat_decl"   "Declaration of the static function:"

"Purpose:"

END LIST

END STANDARD

2.14 Hmclass 一个头文件中只声明一个类

头文件类型用HEADER来表示,对应于后缀*.h,*.hh,*.H,*.hxx,详细定义如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmclass ON LIST "HEADER" END LIST END STANDARD

这是RuleChecker为我们做的默认设置,表示认为以*.h,*.hh,*.H,*.hxx为后缀的文件为头文件,检查在这些文件中,是否一个文件只声明一个类

如果默认设置不适合我们的程序,我们可以改变参数的设置,比如我们只是将以.h为后缀的文件作为头文件,就可以做如下的设置:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.h" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmclass ON LIST "HEADER" END LIST END STANDARD

我们甚至可以添加一个新的文件类型来代替原有的CODE,比如我们添加一个叫做MY_ HEADER的文件类型,如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "MY_HEADER" "*.HH" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmclass ON LIST "MY_HEADER" END LIST END STANDARD

现在就只是MY_CODE中指定的后缀起作用了。

2.15 hmdef 头文件中只包含声明,不应包含实现

头文件类型用HEADER来表示,对应于后缀*.h,*.hh,*.H,*.hxx,详细定义如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmclass ON LIST "HEADER" END LIST END STANDARD

这是RuleChecker为我们做的默认设置,表示认为以*.h,*.hh,*.H,*.hxx为后缀的文件为头文件,检查在这些文件中,是否一个文件只声明一个类

如果默认设置不适合我们的程序,我们可以改变参数的设置,比如我们只是将以.h为后缀的文件作为头文件,就可以做如下的设置:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.h" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmclass ON LIST "HEADER" END LIST END STANDARD

我们甚至可以添加一个新的文件类型来代替原有的CODE,比如我们添加一个叫做MY_ HEADER的文件类型,如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "MY_HEADER" "*.HH" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmclass ON LIST "MY_HEADER" END LIST END STANDARD

现在就只是MY_CODE中指定的后缀起作用了。

2.16 hmstruct 避免重复包含头文件

默认情况下,标识字符串的长度为1到999,头文件为以*.h,*.hh,*.H,*.hxx为后缀的文件,定义如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmstruct ON MINMAX 1 999 LIST "HEADER" END LIST END STANDARD

如果默认设置不适合我们的程序,我们可以改变参数的设置,比如我们只是将以.h为后缀的文件作为头文件,就可以做如下的设置:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.h" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmstruct ON MINMAX 1 999 LIST "HEADER" END LIST END STANDARD

我们甚至可以添加一个新的文件类型来代替原有的CODE,比如我们添加一个叫做MY_ HEADER的文件类型,如下:

METRIC module type OFF FORMAT "30"

LIST "HEADER" "*.{h,hh,H,hxx}" END LIST

LIST "MY_HEADER" "*.HH" END LIST

LIST "CODE" "*.cc" "*.cxx" "*.cpp" "*.C" "*.c" END LIST

LIST "INTERFACE" "*.i" END LIST

LIST "YACC" "*_y.c" END LIST

END METRIC

STANDARD hmstruct ON MINMAX 1 999 LIST "MY_HEADER" END LIST END STANDARD

现在就只是MY_CODE中指定的后缀起作用了。

我们也可以改变标识字符串的长度范围:

STANDARD hmstruct ON MINMAX 4 9 LIST "HEADER" END LIST END STANDARD

现在标识字符串的长度范围为4到9。

2.17 identfmt 标识符格式

对于每种标识符,其意义及默认取值如下:

关键字                      描述                     默认取值

type                        类型名                      any

type_ptr                    指针类型名                  type, any

variable                    变量名                      any

variable_ptr                指针变量名                  variable, any

type_func               function type name              function, type, any

type_struct                 结构体类型名                type, any

type_struct_item            结构体数据成员名            variable, any

type_struct_item_ptr      结构体指针数据成员名    type_struct_item, variable_ptr, variable, any

type_union                  联合体类型名                type, any

type_union_item             联合体数据成员名            variable, any

type_union_item_ptr         联合体指针数据成员名        type_union_item, variable_ptr, variable, any

enum                        枚举数据类型名              type, any

const_enum_item             枚举数据成员名              const,  any

class                       类名                        type, any

class_attr                  类数据成员名                variable, any

class_attr_ptr              类指针数据成员名           variable_ptr, class_attr, variable, any

method                      类成员函数名                function, class_attr, any

namespace                   名字空间                    any

function                    函数名                     any

const                        const常量名                any

const_ptr                   const指针常量名            const, any

var_stat                     static变量名(不包括类中的static数据成员)    variable,

                                                                           any

var_stat_ptr               static指针变量名        var_stat, variable_ptr, variable, any

var_glob                    全局变量名                  variable, any

var_glob_pt                全局指针变量名       var_glob, variable_ptr, variable, any

var_auto                   局部变量名             variable, any

var_auto_ptr            局部指针变量名          var_auto, variable_ptr, variable, any

macro                  宏的名字               any

macro_func             宏函数名               macro, function, any

macro_const            宏常量名               macro, const, any

macro_flag             宏标识名               macro, any

列表中的第三列是在未为该类标识符指定命名格式时该类标识符采用的默认格式,例如,如果没有为macro_func,macro_constmacro_flag特别的指定命名格式,而只是为macro指定了命名格式,那么macro_func,macro_constmacro_flag都采用为macro指定的命名格式。

标识符的格式是通过一个字符表达式来设置的,具体的设置方法请参见Headercom中的相关描述。

默认情况下,RuleChecker只要求在const常量和宏标识符中不能使用小写字母,设置如下:

STANDARD identfmt ON

LIST

"any"                       ".*"

"type"                      ".*"

"type_ptr"                  ".*"

"variable"                  ".*"

"variable_ptr"              ".*"

"type_func"                 ".*"

"type_struct"               ".*"

"type_struct_item"          ".*"

"type_union"                ".*"

"type_union_item"           ".*"

"enum"                      ".*"

"const_enum_item"           ".*"

"class"                     ".*"

"class_attr"                ".*"

"class_attr_ptr"            ".*"

"method"                    ".*"

"namespace"                 ".*"

"function"                  ".*"

"const"                     "[A-Z0-9_]*"

"const_ptr"                 "[A-Z0-9_]*"

"var_stat"                  ".*"

"var_stat_ptr"              ".*"

"var_glob"                  ".*"

"var_glob_ptr"              ".*"

"var_auto"                  ".*"

"var_auto_ptr"              ".*"

"macro"                     "[^a-z]*"

END LIST END STANDARD

如果我们对标识符做如下要求:

类数据成员要以“m_”开头;

类中的指针数据成员要以“m_p”开头;

const常量和宏不能以“_”开头和结尾,并且不能包含小写字母;

全局变量要以“g_”开头;

全局指针变量要以“g_p”开头;

其它的标识符不能以_”开头和结尾;

则设置如下:

STANDARD identfmt ON

LIST

"any"               "[^_](.*[^_])?$"

"class_attr"        "m_.*[^_]$"

"class_attr_ptr"    "m_p.*[^_]$"

"const"             "[A-Z0-9]([A-Z0-9_]*[A-Z0-9])?$"

"var_glob"          "g_.*[^_]$"

"var_glob_ptr"      "g_p.*[^_]$"

"macro"             "[A-Z0-9]([A-Z0-9_]*[A-Z0-9])?$"

END LIST END STANDARD

2.18 Identl 对标识符长度的要求

RuleChecker默认情况下规定:函数名长度在4到25个字符之间,自定义数据类型名、变量名、常量名、宏名、类名长度在5到25个字符之间,其它标识符的长度在1到25个字符之间。设置如下:

STANDARD identl ON

LIST "any" MINMAX 1 25

"type" MINMAX 5 25

"type_ptr" MINMAX 5 25

"variable" MINMAX 5 25

"variable_ptr" MINMAX 5 25

"type_func" MINMAX 5 25

"type_struct" MINMAX 5 25

"type_struct_item" MINMAX 5 25

"type_union" MINMAX 5 25

"type_union_item" MINMAX 5 25

"enum" MINMAX 5 25

"const_enum_item" MINMAX 5 25

"class" MINMAX 5 25

"class_attr" MINMAX 5 25

"class_attr_ptr" MINMAX 5 25

"method" MINMAX 4 25

"namespace" MINMAX 5 25

"function" MINMAX 4 25

"const" MINMAX 5 25

"const_ptr" MINMAX 5 25

"var_stat" MINMAX 1 25

"var_stat_ptr" MINMAX 1 25

"var_glob" MINMAX 5 25

"var_glob_ptr" MINMAX 5 25

"var_auto" MINMAX 1 25

"var_auto_ptr" MINMAX 1 25

"macro" MINMAX 5 25

END LIST END STANDARD

可以根据需要修改最大、最小值。

2.19 Identres 设置禁止使用的标识符

RuleChecker默认情况下,不禁用任何标识符。设置如下:

STANDARD identres ON LIST END LIST END STANDARD

假如我们要禁用 "true" 和 "false"这两个标识符,则设置如下:

STANDARD identres ON LIST "true" "false" END LIST END STANDARD

2.20 incltype 设置可包含的文件

RuleChecker默认情况下,只允许头文件被包含到其它代码文件中去,HEADER代表头文件,CODE代表实现文件,设置如下:

STANDARD incltype ON

LIST "HEADER" "HEADER" END LIST

LIST "CODE" "HEADER" END LIST

END STANDARD

如果我们还允许在实现文件中包含其他的实现文件,则设置如下:

STANDARD incltype ON

LIST "HEADER" "HEADER" END LIST

LIST "CODE" "HEADER" "CODE" END LIST

END STANDARD

2.21 macrocharset 在宏中禁用某些字符

RuleChecker默认情况下,不禁用任何字符。设置如下:

STANDARD macrocharset ON LIST "constant" "" "function" "" END LIST END

STANDARD

如果要在宏常量中禁用字符@#!&/[]{}~‘’,在宏函数中禁用字符#@%.\,则设置如下:

STANDARD macrocharset ON LIST "constant" "@#!&/[]{}~‘’" "function"

"#@%.\" END LIST END STANDARD

2.22 mconst 限制宏常量的使用

RuleChecker的默认设置是“var”项被选中,设置如下:

STANDARD mconst ON "var" END STANDARD

选中“const”的设置如下:

STANDARD mconst ON "const" END STANDARD

选中“nodefine”的设置如下:

STANDARD mconst ON "nodefine" END STANDARD

2.23 mname 文件命名

RuleChecker默认情况下,文件名与类名比较的字符个数为1到5。设置如下:

STANDARD mname ON MINMAX 1 5 END STANDARD

如果要使文件名与类名比较的字符个数为4到10,则设置如下:

STANDARD mname ON MINMAX 4 10 END STANDARD

2.24 operass 为类重载“=”操作符

RuleChecker的默认情况下,参数"dynalloc"是不被设置的,如下:

STANDARD operass ON END STANDARD

此时,类中必须要重载“=”操作符。

如果仅在当类中包含指针类型的数据成员时,才要求类重载“=”操作符,那么按如下的方法设置:

STANDARD operass ON "dynalloc" END STANDARD

2.25 parammode 明确标识出函数参数的类型

RuleChecker默认情况下,要求函数参数列表中的每个参数之前,必须出现"IN", "OUT" 和"INOUT"这三个标识字符串中的任意一个,如下:

STANDARD parammode ON LIST "OUT" "INOUT" "IN" END LIST END STANDARD

如果要求函数参数列表中的每个参数之前,必须出现且只能出现标识字符串"IN",则设置如下:

STANDARD parammode ON LIST "IN" END LIST END STANDARD

该规则存在的问题:参数列表中用“INOUT”修饰参数时,在VC中不能通过编译。所以提供“INOUT”这个标识符没有实际意义。只能使用"OUT"、"IN",设置如下;

STANDARD parammode ON LIST "OUT" "IN" END LIST END STANDARD

即:要求函数参数列表中的每个参数之前,必须出现标识字符串"IN"或"OUT"。

2.26 sectord "public", "private"和"protected" 的声明顺序

RuleChecker默认情况下该参数为空,如下:

STANDARD sectord ON LIST END LIST END STANDARD

这时,RuleChecker会禁止类中出现任何访问控制级别的声明,所以这个默认设置是没有什么实际意义的。

如果我们允许在类中声明private、、protected、public访问控制级别的成员,并且要求声明的顺序依次为:默认访问控制级别成员、private成员protected成员public成员。,则设置如下:

STANDARD sectord ON LIST "" "private" "protected" "public" END LIST END STANDARD

2.27 swdef switch语句中的default分支

RuleChecker默认情况下参数被设置为"last",如下:

STANDARD swdef ON "last" END STANDARD

如果要求在switch语句块中只要有default分支即可,而不管它出现的位置,则设置如下:

STANDARD swdef ON END STANDARD

2.28 swend 对switch语句中每个分支结尾的要求

RuleChecker默认情况下参数被设置为"nolast",switch语句最后一个分支不做要求,如下:

STANDARD swend ON "nolast" END STANDARD

如果要求switch语句最后一个分支也要遵守规定,则设置如下:

STANDARD swend ON END STANDARD

2.29 typeres 设置禁用的类型

RuleChecker默认情况下,不禁用任何类型。如下:

STANDARD typeres ON

LIST END LIST

LIST END LIST END STANDARD

如果要禁止在程序中声明、定义int、char类型的变量,并禁止在程序中声明、定义返回值为float的函数,则设置如下:

STANDARD typeres ON

LIST "data" "int" "char" END LIST

LIST "function" "float" END LIST

END STANDARD

2.30 varstruct 关于定义struct、union变量

RuleChecker默认情况下,参数nostruct不被设置,如下:

STANDARD varstruct ON END STANDARD

可以设置nostruct参数,如下:

STANDARD varstruct ON "nostruct" END STANDARD


posted on 2005-07-15 21:27 qiuyangzh 阅读(1580) 评论(0)  编辑 收藏 引用 所属分类: 01 静态测试
只有注册用户登录后才能发表评论。