代码静态检查——正则表达式集锦

8 篇文章 0 订阅

  有句“常在河边走,哪有不湿鞋”的老话,我们搞程序的(搞了十几年,多数都是被程序搞了),总会有走神的时候写下了这样的代码:

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)$

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值