淘宝商城(天猫)高级技术专家.3年研发+3年性能测试调优/系统测试+4年团队管理与测试架构、研发系统实践. 新舞台新气象, 深化测试基础架构及研发架构,希望能在某个技术领域成为真正的技术大牛。欢迎荐才http://bbs.51testing.com/viewthread.php?tid=120496&extra=&page=1 .邮件: jianzhao.liangjz@alibaba-inc.com,MSN:liangjianzhao@163.com.微博:http://t.sina.com.cn/1674816524

对cppcheck做简单扩展支撑非线程安全函数静态扫描

上一篇 / 下一篇  2010-04-03 22:49:19 / 个人分类:自动化测试框架实现与优化

 
  下载 http://sourceforge.net/projects/cppcheck/files/cppcheck/1.42/cppcheck-1.42.tar.gz/download
1 风格类检查函数放在checkdangerousfunctions.h  checkdangerousfunctions.cpp中
2 目前只支持gets/scanf/mktemp函数。原来的实现方式为了增加一个非线程安全函数,需要增多>=3个文件
3 修改头文件checkdangerousfunctions.h

#define MAX_FUNCS_NUM 200
#define MAX_FUNC_LEN 48
extern const char  dangerous_funcs[MAX_FUNCS_NUM][MAX_FUNC_LEN];

class CheckDangerousFunctions : public Check
{
private:
    /** Error Messages.. */
 
 
    void dangerousFunctionnotsafethread(const Token *tok);
 
    bool isDangerousFunction(const Token * tok);

    void getErrorMessages()
    {
       ...
        dangerousFunctionnotsafethread(0);
      ...
    }

}

4 实现实现文件checkdangerousfunctions.cpp:

#include "checkdangerousfunctions.h"
#include <string.h>
//---------------------------------------------------------------------------
const char dangerous_funcs[MAX_FUNCS_NUM][MAX_FUNC_LEN]={"gets (", "asctime (","getc_unlocked (", "getutxid (", "setgrent (", "basename (","getchar_unlocked (", "getutxline (",
    "setkey (", "catgets (" }; //其他更多继续

...

void CheckDangerousFunctions::dangerousFunctions()
{
    for (const Token *tok = _tokenizer->tokens(); tok; tok = tok->next())
    {
        if( isDangerousFunction(tok))
       {
            dangerousFunctionnotsafethread(tok);
      }
    }
}
//---------------------------------------------------------------------------
bool CheckDangerousFunctions::isDangerousFunction(const Token * tok)
{
  bool isMatch=false;
  for (int i=0;i <MAX_FUNCS_NUM  &&  ( false !=strcmp(dangerous_funcs[i],"") ) ;i++)
  {
    if (Token::simpleMatch(tok,dangerous_funcs[i]))
    {
       isMatch=true;
       break;
    }
  }
  return isMatch;
}


void CheckDangerousFunctions::dangerousFunctionnotsafethread(const Token *tok)
{
    std::cout<<"token="<< tok->str()<<std::endl;
    std::string funcname="dangerousFunction";
    std::string str_tip="Found \'";
    funcname.append(tok->str());
    str_tip.append(tok->str());
    str_tip.append("\'. You should use ");
    str_tip.append(tok->str());
    str_tip.append("_s instead.for b2bqa");
    const std::string c_func(funcname);
    const std::string c_tip(str_tip);
    reportError(tok, Severity::style, c_func, c_tip);
}
...

5 应用
编译
make;
执行
./cppcheck -s 文件或者目录

cpplint(http://google-styleguide.googlecode.com/svn/trunk/cpplint/cpplint.py)则在扩展方面更好些。



TAG: 安全 cppcheck 非线程

阿里巴巴一个测试架构师 引用 删除 liangjz   /   2010-04-04 18:31:28
这个也容易实现,就是按行读取特定文件。谢谢提醒!,关键是大家先用起来,这个比样式重要
sihanjishu的个人空间 引用 删除 sihanjishu   /   2010-04-04 17:30:29
大师,我提一个建议。
cpplint与cpplint都是基于规则扫描的。
是否可以做成让他们支持从文件中读取特定的规则。而不需要再嵌入代码。

这样以后我们只需要通过svn不断的去维护一个api与规则的list即可了。
 

评分:0

我来说两句

显示全部

:loveliness: :handshake :victory: :funk: :time: :kiss: :call: :hug: :lol :'( :Q :L ;P :$ :P :o :@ :D :( :)

Open Toolbar