您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 薪酬管理 > cppcheck的检查项的实现
检查类cppcheck共有15个检查类实现了其检查功能自动变量检查自动变量问题自动变量也就是局部变量,存储空间在栈stack中,函数结束时空间被释放,如果此时变量地址被外部空间的函数使用,将会引起错误。自动变量暴露到外部窗口从参数(指向地址变量指针即指向指针的指针)return全局指针变量…其他….自动变量检查由参数传递局部变量地址由程序返回intf(char**fp){Charc=’a’;*fp=&c;return0;}char*f(inti){charc=‘a’;return&c;}(error)Assigningaddressoflocalauto-variabletoafunctionparameter.(error)Returnoftheaddressofanauto-variable错误举例:自动变量检查实现类classCheckAutoVariablesClassCheckAutoVariablesautoVariables();检查自动变量returnPointerToLocalArray();检查是否返回了指向局部数组的指针returnReference()检查是否返货了指向局部变量的引用returncstr()检查是否返回局部字符串CheckAutoVariables.autoVariables()实现:关键变量:std::setstd::stringfp_list;函数参数中指向指针的指针参数集合std::setunsignedintvd_list;自动变量集合std::setunsignedintvda_list;自动变量数组集合std::setunsignedintunknown_type;boolbegin_function=false;进入函数的标志boolbegin_function_decl=false进入函数参数声明部分标志函数CheckAutoVariables.autoVariables()错误捕获特征自动变量地址被赋给函数参数“[;{}]%var%=&%var%%var%是fp_list.%var%invd_list[;{}]*%var%=&%var%%var%是fp_list.%var%invd_list[;{}]%var%[%any%]=&%var%“%var%是fp_list.%var%invd_list自动变量地址返回return&%var%;%var%invd_list无效空间释放free(%var%);isAutoVarArray%var%invda_list.returnPointerToLocalArray()提取数组特征[;{}]%type%%var%[“将所有数组变量加入到std::setunsignedintarrayVar错误特征“return%var%”且%var%在集合arrayVar中返回引用函数的问题std::string&f(){std::stringstr_local;returnstr_local;}当f()运行结束时str_local其实已经被释放了。*好消息是gcc就能查出此类问题.returnReference()描述:检查返回自动变量引用的函数(error)Returningreferencetoautovariable关键数据std::setunsignedintlocalvar;存储所有发现的自动变量寻找目标函数——返回引用的函数函数特征%type%&%var%(“或&%var%(.returnReference()提取数组特征“[;{}]%type%%var%[”或“%type%%any%%var%”;将所有自动变量加入到localvar错误特征“return%var%;”且%var%在集合calvar中.returncstr()描述:检查返回字符串自动地址的函数(error)Returningpointertoautovariable关键数据std::setunsignedintlocalvar;存储所有发现的自动变量寻找目标函数——返回字符串的函数特征constchar*或&%var%(.returncstr()提取变量特征%type%%var%[;=]localvar.insert(tok2-next()-varId());将所有自动变量加入到localvar错误特征return%var%.c_str();“且%var%在集合localvar中存在问题没有处理指针传递识别不精确错误检查不精确缓冲区溢出检查缓冲区溢出问题缓冲区也就是一块内存空间,它可以是在栈中的局部变量(例如,静态数组),也可以是堆中的内存区域,程序中动态产生(例如,malloc,C++支持的动态数组)变量也就是局部变量。所谓溢出也就是访问的地址空间超出了缓冲区内存区域,常见有两种方式导致溢出,一是显示的index越界,如数组越界,另外就是一些内存操作函数使用不当引发,如memcpy,memset…等内存操作函数缓冲区溢出检查由index越界内存操作程序使用不当voidf(){chararrary[10];charc;c=arrary[11];}voidf(){char*buffer=newchar[10];memset(buffer,0,11);}错误举例:缓冲区溢出检查实现类classCheckBufferOverrun缺陷不支持指针传递识别缓冲区精确度不高动态数组,malloc固定空间等缓冲区不能识别字符串常量char*p=“hello”(注:这段空间不是缓冲区,不可写哦)内存操作函数检查的覆盖面不光,及一些双内存空间操作检查的不好如memcpy(void*destin,void*source,unsignedn);类检查面向对象编程问题c++的面向对象编程存在一些安全隐患,一些经典的c++编程书籍都有提到,cppcheck实现了《effectivec++》中提到的一些安全隐患检查如:多态基类需要实现vitual的析构函数不在构造和析构函数中使用vitual函数operator=必须返回*thisoperator=需处理自我赋值的情况……这些特性要加–s才启动类检查实现类classCheckClass类检查主要实现函数checkClass.constructors();checkClass.operatorEq();checkClass.privateFunctions();checkClass.thisSubtraction();checkClass.checkConst();checkClass.virtualDestructor();checkClass.operatorEqToSelf();checkClass.operatorEqRetRefThis();其他检查检查扩充Cppcheck预留接口classcheckother内存泄露检查内存泄露问题内存泄露指的是在程序运行时,动态的申请了内存(堆),但是使用过后没有释放,导致一些内存永远得不到收回。这是cppcheck最有价值的检查功能,也是实现代码最长的一块检查内存泄露检查实现类classCheckMemoryLeakStructMemberclassCheckMemoryLeakInFunctionclassCheckMemoryLeakInClassclassCheckMemoryLeakNoVarCheckMemoryLeakStructMember检查内容:在一个函数内、检查结构成员结构体被释放(返回)时,其成员不释放空间返回错误(error)Memoryleak:STRUCT.MEMBER中间点表示成员典型错误类型Structbase{char*p;}Voidf(){structbase*q;q=malloc(sizeof(structbase))q-p=malloc(12);free(q);}ClassCheckMemoryLeakStructMember实现接口(runSimplifiedChecks)核心函数check()辅助函数getAllocType()getDeallocationType()voidrunSimplifiedChecks(…){CheckMemoryLeakStructMembercheckMemoryLeak(…);checkMemoryLeak.check();}ClassCheckMemoryLeakInClass检查1成员变量在构造函数中赋空间,析构函数中没有被释放2成员变量在函数(所有函数,不单单是一个函数中)中分配空间,与释放空间函数不成匹配(malloc–free,new-delete)出现算法描述:两个变量:AllocDealloc一但对成员变量被分配空间,Alloc被置值,如果发现对变量释放空间函数,Dealloc置值,并立即对比,是否是同一类内存申请释放函数,如果不是,则立即报dismatch错,遍历完所有类的函数典型错误类型classbase{private:inti;char*p;char*q;public:intj;base();~base();voidmemalloc();voidmemdealloc();}base::base(){p=malloc(12);}voidbase::memalloc(){q=malloc(12);free(p);}错误输出否存在有Alloc无Dealloc的情况,有则报错memleak,(有函数中有申请,必须有函数释放,不一定在同一函数中申请释放)(error)Memoryleak:CLASSNAME::MEMBER发现不匹配(error)MismatchingallocationanddeallocationCLASSNAME::MEMBER检查构造函数,析构函数中是否成对(申请,释放)(如果构造中有内存申请,析构中必须有释放,)(error)Memoryleak:CLASSNAME::MEMBERClassCheckMemoryLeakInClass实现接口(runSimplifiedChecks)核心函数check(),variable()辅助函数getAllocType()getDeallocationType()voidrunSimplifiedChecks(…){…checkMemoryLeak.check();}典型错误类型Voidf(){g(malloc(SIZE));}ClassCheckMemoryLeakNoVar检查函数的参数部分有无内存泄露报错信息:(error)AllocationwithFUNCNAME,FUNCNAMEdoesn'treleaseit.ClassCheckMemoryLeakNoVar实现接口(runSimplifiedChecks)核心函数check()辅助函数getAllocType()getDeallocationType()voidrunSimplifiedChecks(…){CheckMemoryLeakNoVarcheckMemoryLeak(…);checkMemoryLeak.check();}ClassCheckMemoryLeakInFunction检查◦以函数为单位的检查,参数,局部变量指针的检查错误报告典型错误Voidf(char*p,inti){char*q;p=malloc(10);q=malloc(10);return;}ClassCheckMemoryLeakInFunction实现接口(runSimplifiedChecks)核心函数check()parseFunctionScope()checkScope()getcode()findLeak()辅助函数getAllocType()getDeallocationType()voidrunSimplif
本文标题:cppcheck的检查项的实现
链接地址:https://www.777doc.com/doc-4879206 .html