±à¼ÍƼö: |
±¾ÎÄÀ´×ÔÓÚ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.exe ËùÔÚ·¾¶Ìí¼ÓÖÁ»·¾³±äÁ¿
PATH ÖС£
Õâʱ£¬½«»á´Ó cppcheck ÖÐÊä³ö£º
Checking
file.c ¡
[file.c:4]: (error) Array ¡®a[10]¡¯ accessed at
index 10, which is out of bounds. |
¼ì²éÎļþ¼ÐÖеÄËùÓÐÎļþ
ͨ³£Ò»¸öÏîÄ¿»áÓÐÐí¶àÔ´Îļþ£¬Èç¹ûÐèҪͬʱ¼ì²é£¬Cppcheck ¿ÉÒÔ¼ì²éÎļþ¼ÐÖеÄËùÓÐÎļþ£º
Èç¹û 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¸öÎļþ»òÎļþ¼Ð
ÅųýÒ»¸öÎļþ»òÎļþ¼ÐÓÐÁ½¸öÑ¡ÏµÚÒ»¸öÑ¡ÏîÊÇÖ»ÌṩÄãÏë¼ì²éµÄ·¾¶ºÍÎļþ£º
ËùÓÐλÓÚ src/a ºÍ src/b ϵÄÎļþ¶¼»á±»¼ì²é¡£
·½Ê½¶þ£ºÊ¹Óà -i Ñ¡Ïî
Õâʱ£¬½«»áºöÂÔÖ¸¶¨µÄÎļþ/Îļþ¼Ð£¬Ê¹ÓÃÏÂÃæÃüÁîÔÚ src/c ½«²»»á±»¼ì²é£º
ÑÏÖØÐÔ
¿ÉÄܵÄÑÏÖØÐÔÏûÏ¢ÓУº
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 Ö»ÏÔʾ´íÎóÏûÏ¢¡£Èç¹ûʹÓà --inconclusive£¬µ±·ÖÎö²»È·¶¨Ê±£¬Ò²»áд´íÎóÏûÏ¢¡£
cppcheck
--inconclusive path |
Õ⵱Ȼ»áµ¼Ö´íÎóµÄ¾¯¸æ£¬¼´Ê¹ÔÚûÓÐ bug µÄÇé¿öÏ£¬Ò²¿ÉÄܻᱨ
bug¡£Èç¹û¿ÉÒÔ½ÓÊÜ´íÎóµÄ¾¯¸æ£¬¿ÉÒÔʹÓôËÃüÁî¡£
±£´æ½á¹ûµ½ÎļþÖÐ
ºÜ¶àʱºò£¬»áÏ£Íû½«½á¹û±£´æÔÚÒ»¸öÎļþÖУ¬¿ÉÒÔʹÓà shell µÄ¹ÜµÀÖØ¶¨Ïò´íÎóÊä³öµ½Ò»¸öÎļþ£º
cppcheck
--inconclusive path |
¶àÏ̼߳ì²é
Ñ¡Ïî -j ÓÃÓÚÖ¸¶¨ÐèҪʹÓõÄÏß³ÌÊý£¬ÀýÈ磬ʹÓà 4 ¸öÏ̼߳ì²éÎļþ¼ÐÖеÄÎļþ£º
×¢Ò⣺Õ⽫½ûÓà 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 À´¸²¸ÇÅäÖÃÊýÁ¿¡£
¼ì²éËùÓÐÅäÖãº
Ö»¼ì²éÅäÖà A£º
µ±¶¨Òåºê A ʱ£¬¼ì²éËùÓÐÅäÖãº
cppcheck
-DA --force file.c |
ÁíÒ»¸öÓÐÓõıêÖ¾¿ÉÄÜÊÇ -U£¬Ëü䶨Òå·ûºÅ¡£ Ó÷¨Ê¾Àý£º
ÕâÒâζ×Å 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
Ò»¸öÏûÏ¢µÄÀàÐÍ/µÈ¼¶
|