有句“常在河边走,哪有不湿鞋”的老话,我们搞程序的(搞了十几年,多数都是被程序搞了),总会有走神的时候写下了这样的代码:
if (a != 1 || a != 2)
而我们想要的应该是这样的:
if (a != 1 && a != 2)
十几年的代码生涯中,我看过太多这样的代码。有一些代码静态检查工具可能会检查出这种情况(但只是可能),比如pclint、boundcheck等等。我在项目中,经常即兴用正则表达式搜索一下有类似“笔误”的代码,本文记录一下这些正则表达式,以备急用。
-
查找C++ if语句错误:
!= || !=
,== && ==
,>= && <=
,主要是比较笔误:
if\s*\(\s*([\d\w_.]+)\s*\!=\s*[\d\w_]+\s*\|\|\s*\1\s*\!=\s*[\d\w_]+
if\s*\(\s*([\d\w_.]+)\s*==\s*[\d\w_]+\s*&&\s*\1\s*==\s*[\d\w_]+
if\s*\(\s*([\d\w_.]+)\s*\>=?\s*[\d\w_]+\s*&&\s*\1\s*<=?\s*[\d\w_]+
if\s*\(\s*([\d\w_.]+)\s*\<=?\s*[\d\w_]+\s*&&\s*\1\s*>=?\s*[\d\w_]+
-
查找C++ if语句错误:
if (!xx && !xx->yy(...))
,主要是指针判断笔误:
if\s*\(\s*!([\d\w_.]+)\s*&&\s*!\1
if\s*\(\s*([\d\w_.]+)\s*==\s*NULL\s*&&\s*!\1
if\s*\(\s*NULL\s*==\s*([\d\w_.]+)\s*&&\s*!\1
-
查找Lua if语句错误:
~= or ~=
,== and ==
,>= and <=
,<= and >=
:
if\s*([\d\w_.]+)\s*~=\s*[\d\w_]+\s*or\s*\1\s*~=\s*[\d\w_]+
if\s*([\d\w_.]+)\s*==\s*[\d\w_]+\s*and\s*\1\s*==\s*[\d\w_]+
if\s*([\d\w_.]+)\s*>=?\s*[\d\w_]+\s*and\s*\1\s*<=?\s*[\d\w_]+
if\s*([\d\w_.]+)\s*<=?\s*[\d\w_]+\s*and\s*\1\s*>=?\s*[\d\w_]+
-
查找
memcpy
拷贝字符串长度错误:
^.*memcpy\s*\(\s*[^,\r\n]+,\s*[^,\r\n]+,\s*[^,\r\n]*tchar[^,\r\n]*\).*$
-
查找字符数组添加结束符的长度错误:
\[\s*sizeof\s*\(\s*[^,\r\n\[\]]+\s*\)\s*(-\s*1)?\s*\]\s*=\s*0
-
查找
memset(this, 0, sizeof(this))
等笔误【在UE中用perl正则表达式搜】:
^\s*([_\d\w]+)\s*\(\s*[_\d\w]*\s*\)\s*[\r\n]*\s*\{\s*[\r\n]*\s*memset\s*\(\s*this\s*,\s*[_\d\w]+\s*,\s*sizeof\s*\(\s*((\1[_\d\w]+)|((?!\*)\s*this\s*\))|(?!\1|\*\s*this))
-
查找
memset(this, 0, sizeof(this))
等笔误【在VS中用正则表达式搜】:
^:b+{:i}:b*\(:b*:i*:b*\):b*[\r\n]*:b*\{:b*[\r\n]*:b*memset:b*\(:b*this:b*,:b*:d+:b*,:b*sizeof:b*\(:b*~(\1|\*this):i*:b*\)
-
查找lua函数:
^\s*function\s+[_\d\w]+\s*\(
-
查找相同的两行(前提是已排好序),也可以在excel中用“重复”功能:
^(.*)$[\r\n]+^\1$
-
查找lua重复定义的函数:
1、搜索所有函数:^\s*function\s+[_\d\w]+\s*\(
2、整理(掐头去尾):^.*:\s*(function\s+[_\d\w]+\s*\()
和\)[^\r\n]+$
3、去掉参数,加lua后缀:\([^\r\n]*\) => " lua"
,存csv文件;
4、csv排序(4和5步可以在excel中用“重复”功能);
5、查找相同的两行:^([^\r\n]+)$[\r\n]+^\1$
-
查找C++和lua中相同定义的函数:
1、用类似方法提取C++与lua接口文件中的函数,加cpp后缀
2、和lua函数合并到一个csv中,排序
3、查找相同的两行:^([^\r\n ]+) (lua|cpp)$[\r\n]+\1 (lua|cpp)$