Visual Studio中使用正则表达式进行代码规范的检查
温辉敏([email protected]) 2011-1-12午
项目中需要检查团队成员写的代码不符合代码规范的地方并予以修正过来,由于代码比较多,靠人眼一行行代码去看是很枯燥无味而且肯定是会有遗漏的,为此想看看能否找到一种比较高效快捷的方式来尽快的找出不符合代码规范的地方。代码规范的工具主流的有LogiScope和PC Lint,这两个工具都挺好用的,只是用起来要配置很多规则,若有精力用心的去做代码规范的工作,推荐用这两个工具是挺好的。由于我们团队只是想规范下大家的代码编写风格,没有涉及到太多规则,此时想到了VC中的正则表达式查找。经过一段时间的摸索,终于整出来了一些检测表达式,感觉也挺有效率的,能发现大部不符合规范的地方。柔性有损,记得有位同事[1]和说过这句话,主要意思是要做到100%的完美那是非常难的,能花划算的精力做到项目可接受、业界可接受的程度就很不错了。所以这里的规范检测也不是能检测所有不符合规范的地方,但是能花较小的精力达到一个理想的结果。
注意事项:查找过程中查找范围尽量控制在一个项目,若要整个解决方案查找,则要注意不要修改VC的include等文件。
(额外提下,若是有坚强的毅力,可以将VC的警告级别调到最高,让VC对于每一个警告都报错,这样0警告的代码将是质量比较好的代码。)
【关键字】Visual Studio、VC、正则表达式、代码规范
2010-12-28
正则表达式:{^:b*{if\(}|{while\(}|{for\(}|{else:b*if\(}|{switch\(}|{catch\(}}
用来查下面的代码规范问题:
if( while( for(等if和(之间没有空格的问题
if(bIsOK) { … } 改成如下(if和(之间有一个空格): If (bIsOK) { … } |
截图:
正则表达式:{={[^:b=]}}|{{[^:b:Sm=!><+:Pd%\*/\|&\^\\~]}=}|{[^:b]{[:Sm=!><+:Pd%\*/\|&\^\\~]}=}
用来查下面的代码规范问题:
if (NULL==m_databaseModule)
keyValueExt.m_strSection=strSection;
if (NULL==m_databaseModule) { … } 改成如下(==左右都各有一个空格): if (NULL == m_databaseModule) { … }
keyValueExt.m_strSection=strSection; 改成如下(=左右都各有一个空格) keyValueExt.m_strSection = strSection; |
截图:
2010-12-27
正则表达式:{\).*\{}|{namespace.*\{}|{class.*\{}|{enum.*\{}|{struct.*\{}|{else:b*\{}
查找下面不符合规范的代码
if(){
}
if(){ } 应改成如下(大括号另起一行): if() { } |
组合各个情况可以采用|来进行或操作,正则表达式输入如下字符串:
{/).*/{}|{namespace.*/{}|{class.*/{}|{enum.*/{}|{struct.*/{}
正则表达式:
{^:b*{int|char|{unsigned:b*char}|void|bool|float|long|unsigned|short|__int64|BOOL|UINT|INT|LONG|byte|BYTE|DWORD|WORD|TCHAR|uint32|time_t|UINT64|INT64|LPCSTR|ULONG|BSTR|HRESULT|HINSTANCE|HANDLE|HBITMAP}:b.*[^\(\)],.*[^\(\)];}
查找如下的问题:
int i,j,k;
int i,j,k; 应改成如下(大括号另起一行): int i = 0; int j = 0; int k = 0; |
查找正则表达式为:
{^:b*{int|char|{unsigned:b*char}|void|bool|float|long|unsigned|short|__int64|BOOL|UINT|INT|LONG|byte|BYTE|DWORD|WORD|TCHAR|uint32|time_t|UINT64|INT64|LPCSTR|ULONG|BSTR|HRESULT|HINSTANCE|HANDLE|HBITMAP}:b.*[^\(\)],.*[^\(\)];}
2010-12-29
正则表达式:
{[ \t]:b*{if|else|while|switch}:b*{{.*;}|{.*\n.*;}}}
查找如下的问题:
if ( m_bEnabled )
m_rLockObject.Enter();
if ( m_bEnabled ) m_rLockObject.Enter(); 应改成如下(加上大括号并另起一行): if ( m_bEnabled ) { m_rLockObject.Enter(); } |
正则表达式:
^:b*{int|char|{unsigned:b*char}|void|bool|float|long|unsigned|short|__int64|BOOL|UINT|INT|LONG|byte|BYTE|DWORD|WORD|TCHAR|uint32|time_t|UINT64|INT64|LPCSTR|ULONG|BSTR|HRESULT|HINSTANCE|HANDLE|HBITMAP}{{:b*}|{:b*\*:b*}}:i{{:b*}|{:b*\[.*\]:b*}};
查找如下的问题:
int i;
int i; 应改成如下(变量进行初始化): int i = 0; |
正则表达式:{:b*{for|if|while}.*{{[^:b-<>][<>]}|{[^-<>][<>][^:b=]}}}
查找如下的问题:
if(i<2)
if(i<2) 应改成如下(<前后应要有空格): if(i < 2) |
2010-12-28
直接查找switch,然后看是否有default分支。
看看每个case语句处是否有break语句;
若觉得是异常,可在default分支加上assert等防御性代码看看。
2010-12-28
正则表达式:
{{{[^:b\n]}\<\<{[^:b\n]}}|{{[^:b\n]}\<\<}|{\<\<{[^:b\n]}}}
查找如下的问题:
cout<<i<<j<<k;
cout<<i<<j<<k; 应改成如下(<<左右都加上空格): cout << i << j << k; |
2011-02-15
各个函数声明之间、各个函数实现之间都空一行,不要出现无谓的多个空行
要查找空了2个空行以上的可以采用如下正则表达式:
正则表达式:\n\n\n
查找如下的问题:
int max(int i, int j) { return ((i > j)?i:j); }
int min(int i, int j) { return ((i < j)?i:j); }
|
应该改成两个函数间空一行:
int max(int i, int j) { return ((i > j)?i:j); }
int min(int i, int j) { return ((i < j)?i:j); }
|
【1】我友同事邓永龙。