C++代码静态检查
代码静态检查
人生要不断完善自己,项目也一样,最近用到了代码静态检查工具来检测了一下项目代码,用了两个工具,linux下的cppcheck和windows下的TscanCode,用法都很简单,就不细说了,最后得出的结果还是有一些区别的,大部分是
真实存在的代码问题。
cppcheck的结果像这样:
[haizhan_src_2/ActivityTask/ActivityTask.cpp:48]: (warning) Member variable 'CActivityTask::tmExpire' is not initialized in the constructor.
[haizhan_src_2/ActivityTask/ActivityTask.cpp:48]: (warning) Member variable 'CActivityTask::bSendInsert' is not initialized in the constructor.
[haizhan_src_2/ActivityTask/ActivityTask.cpp:48]: (warning) Member variable 'CActivityTask::bDBInsert' is not initialized in the constructor.
[haizhan_src_2/Email/SystemEmailManager.cpp:407] -> [haizhan_src_2/Email/SystemEmailManager.cpp:404]: (error) Iterator 't_it' used after element has been erased.
[haizhan_src_2/userinfo_export/userinfo_export_serviceService.cpp:379]: (error) Dereferencing '_pmapRoleInfos' after it is deallocated / released
它会给出一些warning和error,包括未初始化的变量,数组越界使用,失效的迭代器,无效的函数等等等等。
TscanCode的结果:
<?xml version="1.0" encoding="UTF-8"?>
<results>
<error file="E:\Work\Server\haizhan_src\ArenaMain\ArenaSceneDead.cpp" line="255" id="nullpointer" subid="dereferenceAfterCheck" severity="error" msg="[_pPlayerFlag.player_before] is dereferenced here after checking null at line 250, which implies that [ _pPlayerFlag.player_before ] may be null dereferenced." web_identify="{"identify":"_pPlayerFlag.player_before"}" func_info="int CArenaSceneDead::check_FlagTimeValue ( int _unTimeInterval , TFlagPlayerInfo * _pPlayerFlag )"/>
<error file="E:\Work\Server\haizhan_src\BattleMatch\BattleMapMatch.cpp" line="1265" id="nullpointer" subid="dereferenceAfterCheck" severity="error" msg="[_pOtherMatchTeam] is dereferenced here after checking null at line 1194, which implies that [ _pOtherMatchTeam ] may be null dereferenced." web_identify="{"identify":"_pOtherMatchTeam"}" func_info="void CMapMatch::RepairBalance ( TMatchTempCampVec & _stMatchTempCampVec , TMatchTempElo & _stElo , bool _bUseOneTeam , bool _bUsePrioryTeam , CMatchTeamMap * _pOtherMatchTeam , int _eOtherMatchType )"/>
<error file="E:\Work\Server\haizhan_src\Warship\ExtraPartPlugin.cpp" line="707" id="nullpointer" subid="dereferenceAfterCheck" severity="error" msg="[t_consume] is dereferenced here after checking null at line 700, which implies that [ t_consume ] may be null dereferenced." web_identify="{"identify":"t_consume"}" func_info="void CExtraPartPlugin::deduct_RankUpConsumables ( int _consumeid , const char * _szReason , int _unReasonParam )"/>
<error file="E:\Work\Server\haizhan_src\xmlloader\MatchBuyDataManager.cpp" line="30" id="logic" subid="uninitMemberVar" severity="warning" msg="Member variable 'TRecommData::pIStdMatchBuyMain,' is not initialized in the constructor." web_identify="{"identify":"TRecommData::pIStdMatchBuyMain,"}" func_info=""/>
<error file="E:\Work\Server\haizhan_src\xmlloader\StdListener.cpp" line="110" id="logic" subid="SignedUnsignedMixed" severity="warning" msg="Unsigned to signed assignment occurs." web_identify="" func_info="void Prop::set_Param1 ( int param )"/>
</results>
同样会给出很多错误,但是比cppcheck更加详细,标明了错误的类型,子类型,错误内容。
总结
两种工具各有千秋,不过个人认为还是TscanCode更好用,报告的内容也更全,腾讯还是做点好事的。。。