Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
Cppcheck Ó÷¨
 
  6096  次浏览      27
 2018-8-3 
 
±à¼­ÍƼö:
±¾ÎÄÀ´×ÔÓÚcsdn£¬±¾Îļòµ¥½éÉÜÁËÒ»ÖÖ C/C++ ´úÂëȱÏݾ²Ì¬¼ì²é¹¤¾ßCppcheckµÄÓ÷¨¡£

¼òÊö

Cppcheck²»Í¬ÓÚ C/C++ ±àÒëÆ÷¼°ºÜ¶àÆäËü·ÖÎö¹¤¾ß£¬Ëü²»¼ì²é´úÂëÖеÄÓï·¨´íÎó¡£Cppcheck Ö»¼ì²é±àÒëÆ÷¼ì²é²»³öÀ´µÄ bug ÀàÐÍ£¬ÆäÄ¿µÄÊǼì²é´úÂëÖÐÕæÕýµÄ´íÎ󣨼´£ºÁãÎ󱨣©¡£

½éÉÜ

Ö§³ÖµÄ´úÂëºÍƽ̨£º

1.¿ÉÒÔ¼ì²é·Ç±ê×¼´úÂ룬°üÀ¨²»Í¬µÄ±àÒëÆ÷À©Õ¹¡¢ÄÚÁª»ã±à´úÂëµÈ¡£

2.Cppcheck Ó¦¸Ã±»´¦Àí×îРC++ ±ê×¼µÄÈκΠC++ ±àÒëÆ÷Ëù±àÒë¡£

3.Cppcheck Ó¦¸ÃÔÚÈκÎÓÐ×ã¹» CPU ºÍÄÚ´æµÄƽ̨ÉϹ¤×÷¡£

ÒªÖªµÀ Cppcheck ÓÐÏÞÖÆ£¬Cppcheck ºÜÉÙÔÚ±¨¸æ´íÎó·½Ãæ³ö´í£¬µ«Óкܶà bug£¬Ëü²»Äܼì²â¡£

ͨ¹ý×Ðϸ²âÊÔÈí¼þ£¬Äã»á·¢ÏÖÈí¼þÖÐÓиü¶àµÄ bug£¬¶ø²»ÊÇʹÓà Cppcheck¡£µ« Cppcheck ÈÔ¿ÉÒÔ¼ì²âµ½ÔÚ²âÊÔºÍÆÀ¹ÀÈí¼þʱ´í¹ýµÄһЩ bug¡£

¿ªÊ¼Ê¹ÓÃ

µÚÒ»¸ö²âÊÔ³ÌÐò

ÕâÀïÓÐÒ»¶Î¼òµ¥µÄ´úÂ룺

int main()
{
char a[10];
a[10] = 0;
return 0;
}

½«´úÂë±£´æ½ø file.c ÎļþÖУ¬Ö´ÐУº

cppcheck file.c

×¢Ò⣺ִÐдËÃüÁîǰ£¬ÐèÒª½« cppcheck.exe ËùÔÚ·¾¶Ìí¼ÓÖÁ»·¾³±äÁ¿ PATH ÖС£

Õâʱ£¬½«»á´Ó cppcheck ÖÐÊä³ö£º

Checking file.c ¡­
[file.c:4]: (error) Array ¡®a[10]¡¯ accessed at index 10, which is out of bounds.

¼ì²éÎļþ¼ÐÖеÄËùÓÐÎļþ

ͨ³£Ò»¸öÏîÄ¿»áÓÐÐí¶àÔ´Îļþ£¬Èç¹ûÐèҪͬʱ¼ì²é£¬Cppcheck ¿ÉÒÔ¼ì²éÎļþ¼ÐÖеÄËùÓÐÎļþ£º

cppcheck path

Èç¹û path ÊÇÒ»¸öÎļþ¼Ð£¬cppcheck ½«µÝ¹é¼ì²éÕâ¸öÎļþ¼ÐÖеÄËùÓÐÔ´Îļþ¡£

Checking path/file1.cpp¡­
1/2 files checked 50% done
Checking path/file2.cpp¡­
2/2 files checked 100% done

ÊÖ¶¯¼ì²éÎļþ»òʹÓÃÏîÄ¿Îļþ

ʹÓà Cppcheck ¿ÉÒÔÊÖ¶¯¼ì²éÎļþ£¬Í¨¹ýÖ¸¶¨Îļþ/Îļþ¼ÐÀ´¼ì²éºÍÉèÖ㬻òÕß¿ÉÒÔʹÓÃÒ»¸ö¹¤³ÌÎļþ£¨cmake/visual studio£©¡£

ʹÓÃÏîÄ¿Îļþ¸ü¿ì£¬ÒòΪËüÖ»ÐèÒª·Ç³£ÉÙµÄÅäÖá£

ÊÖ¶¯¼ì²éÎļþ¿ÉÒÔ¸üºÃµÄ¿ØÖÆ·ÖÎö¡£

²»Ò»¶¨ÄÄÖÖ·½·¨»áÓÐ×îºÃµÄ½á¹û£¬½¨Òé³¢ÊÔһϣ¬¿ÉÄÜ»áµÃµ½²»Í¬µÄ½á¹û£¬·¢ÏÖ´ó¶àÊý bug ÐèҪʹÓÃÕâÁ½ÖÖ·½·¨¡£

¼ì²éʱÅųýij¸öÎļþ»òÎļþ¼Ð

ÅųýÒ»¸öÎļþ»òÎļþ¼ÐÓÐÁ½¸öÑ¡ÏµÚÒ»¸öÑ¡ÏîÊÇÖ»ÌṩÄãÏë¼ì²éµÄ·¾¶ºÍÎļþ£º

cppcheck src/a src/b

ËùÓÐλÓÚ src/a ºÍ src/b ϵÄÎļþ¶¼»á±»¼ì²é¡£

·½Ê½¶þ£ºÊ¹Óà -i Ñ¡Ïî

Õâʱ£¬½«»áºöÂÔÖ¸¶¨µÄÎļþ/Îļþ¼Ð£¬Ê¹ÓÃÏÂÃæÃüÁîÔÚ src/c ½«²»»á±»¼ì²é£º

cppcheck -isrc/c src

ÑÏÖØÐÔ

¿ÉÄܵÄÑÏÖØÐÔÏûÏ¢ÓУº

1.´íÎó

µ±·¢ÏÖ bug ʱʹÓÃ

2.¾¯¸æ

¹ØÓÚ·ÀÓùÐÔ±à³Ì£¬ÒÔ·ÀÖ¹ bug µÄ½¨Òé

3.·ç¸ñ¾¯¸æ

·ç¸ñÓйØÎÊÌâµÄ´úÂëÇåÀí£¨Î´Ê¹Óõĺ¯Êý¡¢ÈßÓà´úÂë¡¢³£Á¿ÐԵȵȣ©

4.¿ÉÒÆÖ²ÐÔ¾¯¸æ

¿ÉÒÆÖ²ÐÔ¾¯¸æ¡£64 λµÄ¿ÉÒÆÖ²ÐÔ£¬´úÂë¿ÉÄÜÔÚ²»Í¬µÄ±àÒëÆ÷ÖÐÔËÐнá¹û²»Í¬¡£

5.ÐÔÄܾ¯¸æ

½¨Òéʹ´úÂë¸ü¿ì¡£ÕâЩ½¨ÒéÖ»ÊÇ»ùÓÚ³£Ê¶£¬¼´Ê¹ÐÞ¸´ÕâЩÏûÏ¢£¬Ò²²»È·¶¨»áµÃµ½ÈκοɲâÁ¿µÄÐÔÄÜÌáÉý¡£

6.ÐÅÏ¢ÏûÏ¢

ÅäÖÃÎÊÌ⣬½¨ÒéÔÚÅäÖÃÆÚ¼ä½öÆôÓÃÕâЩ¡£

ÆôÓÃÏûÏ¢

ĬÈÏÇé¿öÏ£¬Ö»ÏÔʾ´íÎóÏûÏ¢£¬¿ÉÒÔͨ¹ý --enable ÃüÁîÆôÓøü¶à¼ì²é¡£

ÆôÓþ¯¸æÏûÏ¢£º

cppcheck --enable=warning file.c

ÆôÓÃÐÔÄÜÏûÏ¢£º

cppcheck --enable=performance file.c

ÆôÓÃÐÅÏ¢ÏûÏ¢£º

cppcheck --enable=performance file.c

ÓÉÓÚÀúÊ·Ô­Òò --enable=style ¿ÉÒÔÆôÓþ¯¸æ¡¢ÐÔÄÜ¡¢¿ÉÒÆÖ²ÐÔºÍÑùʽÐÅÏ¢¡£µ±Ê¹ÓÃ¾É XML ¸ñʽʱ£¬ÕâЩ¶¼ÓÉ style ±íʾ£º

ppcheck --enable=style file.

ÆôÓþ¯¸æºÍÐÔÄÜÏûÏ¢£º

cppcheck --enable=warning,performance file.c

ÆôÓà unusedFunction ¼ì²é¡£Õâ²»ÄÜͨ¹ý --enable=style ÆôÓã¬ÒòΪ²»»áÔÚ¿âÖÐÕý³£¹¤×÷¡£

cppcheck --enable=unusedFunction file.c

ÆôÓÃËùÓÐÏûÏ¢£º

cppcheck --enable=all

²»È·¶¨ÏûÏ¢

ĬÈÏÇé¿öÏ£¬Èç¹ûÈ·¶¨£¬Cppcheck Ö»ÏÔʾ´íÎóÏûÏ¢¡£Èç¹ûʹÓà --inconclusive£¬µ±·ÖÎö²»È·¶¨Ê±£¬Ò²»áд´íÎóÏûÏ¢¡£

cppcheck --inconclusive path

Õ⵱Ȼ»áµ¼Ö´íÎóµÄ¾¯¸æ£¬¼´Ê¹ÔÚûÓÐ bug µÄÇé¿öÏ£¬Ò²¿ÉÄܻᱨ bug¡£Èç¹û¿ÉÒÔ½ÓÊÜ´íÎóµÄ¾¯¸æ£¬¿ÉÒÔʹÓôËÃüÁî¡£

±£´æ½á¹ûµ½ÎļþÖÐ

ºÜ¶àʱºò£¬»áÏ£Íû½«½á¹û±£´æÔÚÒ»¸öÎļþÖУ¬¿ÉÒÔʹÓà shell µÄ¹ÜµÀÖØ¶¨Ïò´íÎóÊä³öµ½Ò»¸öÎļþ£º

cppcheck --inconclusive path

¶àÏ̼߳ì²é

Ñ¡Ïî -j ÓÃÓÚÖ¸¶¨ÐèҪʹÓõÄÏß³ÌÊý£¬ÀýÈ磬ʹÓà 4 ¸öÏ̼߳ì²éÎļþ¼ÐÖеÄÎļþ£º

cppcheck -j 4 path

×¢Ò⣺Õ⽫½ûÓà unusedFunction ¼ì²é¡£

ƽ̨

Ó¦¸ÃʹÓÃÒ»¸öÓëÄãµÄÄ¿±êÆ¥ÅäµÄƽ̨ÅäÖá£

ĬÈÏÇé¿öÏ£¬Èç¹û´úÂëÔÚ±¾µØ±àÒëºÍÖ´ÐУ¬Cppcheck »áʹÓñ¾µØÆ½Ì¨ÅäÖá£

Cppcheck ¾ßÓÐÓÃÓÚ Unix ºÍ Windows Ä¿±êµÄÄÚÖÃÅäÖ㬿ÉÒÔÇáËɵØÊ¹ÓÃÕâЩ --platform ÃüÁîÐбêÖ¾¡£

»¹¿ÉÒÔÔÚ XML ÎļþÖд´½¨×Ô¼ºµÄ×Ô¶¨ÒåÆ½Ì¨ÅäÖá£ÕâÀïÓÐÒ»¸öÀý×Ó£º

<?xml version="1"?>
<platform>
<char_bit>8</char_bit>
<default-sign>signed</default-sign>
<sizeof>
<short>2</short>
<int>4</int>
<long>4</long>
<long-long>8</long-long>
<float>4</float>
<double>8</double>
<long-double>12</long-double>
<pointer>4</pointer>
<size_t>4</size_t>
<wchar_t>2</wchar_t>
</sizeof>
</platform>

씀
µ±Ê¹Óà CMake »ò Visual Studio ʱ£¬¿ÉÒÔʹÓà --project À´·ÖÎöÏîÄ¿¡£

Ëü»á¸øÄã¿ìËٺͼòµ¥µÄ½á¹û£¬²»ÐèÒª×öÌ«¶àµÄÅäÖᣵ«ºÜÄÑ˵ÕâÊÇ·ñ½«»á¸øÄã×îºÃµÄ½á¹û£¬½¨ÒéÊÔÒ»ÊÔËü£¬²¢³¢ÊÔ²»Ê¹Óà --project ·ÖÎöÔ´´úÂ룬¿´ÄĸöÑ¡Ïî¸üÊʺϡ£

CMake

Cppcheck ¿ÉÒÔÀí½â±àÒëÊý¾Ý¿â£¬¿ÉÒÔÓà CMake Éú³ÉÕâЩ¡£

ÀýÈ磺

$ cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON

Îļþ compile_commands.json ÔÚµ±Ç°Îļþ¼ÐÖд´½¨¡£

ÏÖÔÚÏñÕâÑùÔËÐÐ Cppcheck£º

$ cppcheck --project=compile_commands.json

¿ÉÒÔ¶Ôµ¥¸öÏîÄ¿Îļþ£¨*.vcxproj£©»òÕû¸ö½â¾ö·½°¸£¨*.sln£©ÔËÐÐ Cppcheck¡£

ÔÚÕû¸ö½â¾ö·½°¸ÉÏÔËÐÐ cppcheck£º

$ cppcheck --project=foobar.sln

ÔÚµ¥¸öÏîÄ¿ÎļþÉÏÔËÐÐ cppcheck£º

$ cppcheck --project=foobar.vcxproj

×¢Ò⣺»¹ÓÐÒ»¸ö Visual Studio ²å¼þ£¬ÔÊÐíÔÚ Visual Studio ÖÐÔËÐÐ cppcheck¡£

Ô¤´¦ÀíÆ÷ÉèÖÃ

Èç¹ûʹÓà --project£¬ÄÇô Cppcheck ½«Ê¹ÓÃÏîÄ¿ÎļþÖеÄÔ¤´¦ÀíÆ÷ÉèÖá£

·ñÔò£¬¿ÉÄÜÐèÒªÅäÖðüº¬Â·¾¶£¬¶¨ÒåµÈ¡£

¶¨Òå

ÕâÓÐÒ»¸öÎļþ£¬ÓÐÁ½¸öÅäÖ㨶¨ÒåºÍû¶¨Òå A£©£º

#ifdef A
x = y;
#else
x = z;
#endif

ĬÈÏÇé¿öÏ£¬Cppcheck ½«¼ì²éËùÓÐÔ¤´¦ÀíÆ÷ÅäÖ㨳ýÁËÄÇЩ¾ßÓÐ #error µÄÅäÖã©£¬ËùÒÔÉÏÊö´úÂ뽫±»·ÖÎöÔÚµ± A ¶¨ÒåºÍ²»¶¨ÒåµÄÇé¿öÏ¡£

¿ÉÒÔʹÓà -D ¸ü¸Ä¡£µ±Ê¹Óà -D ʱ£¬cppcheck ½«Ä¬ÈÏÖ»¼ì²é¸ø¶¨µÄÅäÖ㬲»»á¼ì²éÆäËü£¬Õâ¾ÍÊDZàÒëÆ÷µÄ¹¤×÷Ô­Àí¡£µ«ÊÇ¿ÉÒÔʹÓà --force »ò --max-configs À´¸²¸ÇÅäÖÃÊýÁ¿¡£

¼ì²éËùÓÐÅäÖãº

cppcheck file.c

Ö»¼ì²éÅäÖà A£º

cppcheck -DA file.c

µ±¶¨Òåºê A ʱ£¬¼ì²éËùÓÐÅäÖãº

cppcheck -DA --force file.c

ÁíÒ»¸öÓÐÓõıêÖ¾¿ÉÄÜÊÇ -U£¬Ëü䶨Òå·ûºÅ¡£ Ó÷¨Ê¾Àý£º

cppcheck -UX file.c

ÕâÒâζ×Å X ûÓж¨Ò壬Cppcheck ²»»á¼ì²éµ±¶¨Òå X ʱ»á·¢Éúʲô¡£

XML Êä³ö

Cppcheck ¿ÉÒÔÉú³É XML ¸ñʽµÄÊä³ö¡£ÓÐÒ»¸ö¾ÉµÄ XML ¸ñʽ£¨version 1£©ºÍÒ»¸öÐ嵀 XML ¸ñʽ£¨version 2£©¡£Èç¹û¿ÉÒÔ£¬ÇëʹÓÃа汾¡£

¾É°æ±¾±£³ÖÏòºó¼æÈÝÐÔ¡£Ëü²»»á¸Ä±ä£¬µ«ÓÐÒ»Ìì¿ÉÄܻᱻɾ³ý¡£Ê¹Óà --xml Ö§³ÖÕâÖÖ¸ñʽ¡£

а汾ÐÞ¸´Ò»Ð©¾É¸ñʽµÄÎÊÌ⡣иñʽ¿ÉÄÜ»áÔÚ cppcheck µÄδÀ´°æ±¾ÖиüУ¬²¢´øÓÐеÄÊôÐÔºÍÔªËØ¡£ÓÃÓÚ¼ì²éÎļþ²¢ÒÔÐ嵀 XML ¸ñʽÊä³ö´íÎóµÄʾÀýÃüÁ

cppcheck --xml-version=2 file.cpp

ÕâÊÇÒ»¸ö version 2 ʾÀý£º

<?xml version="1.0" encoding="UTF-8"?>
<results version="2">
<cppcheck version="1.66">
<errors>
<error id="someError" severity="error" msg="short error text"
verbose="long error text" inconclusive="true" cwe="312">
<location file0="file.c" file="file.h" line="1"/>
</error>
</errors>
</results>

<error> ÔªËØ

ÿ¸ö´íÎó¶¼ÔÚ <error> ÔªËØÖУ¬ÊôÐÔ£º

id

´íÎóµÄ id£¬ÕâЩ¶¼ÊÇÓÐЧµÄ·ûºÅÃû³Æ¡£

severity

error¡¢warning¡¢style¡¢performance¡¢portability¡¢information ÖеÄÈκÎÒ»¸ö¡£

msg

¶Ì¸ñʽµÄ´íÎóÏûÏ¢

verbose

³¤¸ñʽµÄ´íÎóÏûÏ¢

inconclusive

´ËÊôÐÔ½öÔÚÏûÏ¢²»È·¶¨Ê±Ê¹ÓÃ

cwe

ÏûÏ¢µÄ CWE ID£¬´ËÊôÐÔ½öÔÚÏûÏ¢µÄ CWE ID ÒÑ֪ʱʹÓá£

<location> ÔªËØ

<location> ÔªËØÁгöËùÓдíÎóÏà¹ØÎ»Öã¬Ê×ÏÈÁгöÖ÷ҪλÖá£

ÊôÐÔ£º

file

ÎļþÃû£¬Ïà¶Ô·¾¶ºÍ¾ø¶Ô·¾¶¶¼ÊÇ¿ÉÄܵġ£

file0

Ô´ÎļþµÄÃû³Æ£¨¿ÉÑ¡£©

line

Ò»¸öÊý×Ö

msg

´ËÊôÐÔÉв»´æÔÚ£¬µ«½«À´¿ÉÒÔΪÿ¸öλÖÃÌí¼ÓÒ»Ìõ¶ÌÏûÏ¢¡£

¸ñʽ»¯Êä³ö

Èç¹ûÏëÖØÐ¸ñʽ»¯Êä³ö£¬Ê¹Ëü¿´ÆðÀ´²»Í¬£¬¿ÉÒÔʹÓÃÄ£°å¡£

Òª»ñµÃ Visual Studio ¼æÈݵÄÊä³ö£¬¿ÉÒÔʹÓà --template=vs£º

cppcheck --template=vs gui/test.cpp

Êä³ö½«ÈçÏÂËùʾ£º

Checking gui/test.cpp¡­
gui/test.cpp(31): error: Memory leak: b
gui/test.cpp(16): error: Mismatching allocation and deallocation: k

Òª»ñµÃ gcc ¼æÈݵÄÊä³ö£¬¿ÉÒÔʹÓà --template=gcc£º

cppcheck --template=gcc gui/test.cpp

Êä³ö½«ÈçÏÂËùʾ£º

Checking gui/test.cpp¡­
gui/test.cpp:31: error: Memory leak: b
gui/test.cpp:16: error: Mismatching allocation and deallocation: k

¿ÉÒÔ±àд×Ô¼ºµÄģʽ£¨ÀýÈ磬¶ººÅ·Ö¸ô¸ñʽ£©£º

cppcheck --template="{file},{line},{severity},{id},{message}" gui/test.cpp

Êä³ö½«ÈçÏÂËùʾ£º

Checking gui/test.cpp¡­
gui/test.cpp,31,error,memleak,Memory leak: b
gui/test.cpp,16,error,mismatchAllocDealloc,Mismatching allocation and deallocation: k

Ö§³ÖÒÔϸñʽ˵Ã÷·û£º

1.callstack

µ÷ÓÃÕ» - Èç¹û¿ÉÓÃ

2.file

ÎļþÃû

3.id

ÏûÏ¢ id

4.line

ÐкÅ

5.message

ÏêϸµÄÏûÏ¢Îı¾

6.severity

Ò»¸öÏûÏ¢µÄÀàÐÍ/µÈ¼¶

 

 

   
6096 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

Éî¶È½âÎö£ºÇåÀíÀôúÂë
ÈçºÎ±àд³öÓµ±§±ä»¯µÄ´úÂë
ÖØ¹¹-ʹ´úÂë¸ü¼ò½àÓÅÃÀ
ÍŶÓÏîÄ¿¿ª·¢"±àÂë¹æ·¶"ϵÁÐÎÄÕÂ
Ïà¹ØÎĵµ

ÖØ¹¹-¸ÄÉÆ¼ÈÓдúÂëµÄÉè¼Æ
Èí¼þÖØ¹¹v2
´úÂëÕû½àÖ®µÀ
¸ßÖÊÁ¿±à³Ì¹æ·¶
Ïà¹Ø¿Î³Ì

»ùÓÚHTML5¿Í»§¶Ë¡¢Web¶ËµÄÓ¦Óÿª·¢
HTML 5+CSS ¿ª·¢
ǶÈëʽC¸ßÖÊÁ¿±à³Ì
C++¸ß¼¶±à³Ì