寫代碼之際忽然想起了pc-lint這個"古董級"的代碼靜態分析工具;
下午機房的服務器歇菜了,無法調試遊戲,恰好抽出時間來研究一下pc-lint集成在SourceInsight中;
固然百度上也有許多集成的方法,可是常常有某些錯誤,致使進程沒法lint的正常執行;
分3塊部分來說,先說第一塊:
一:安裝pclint和SourceInsight
安裝pclint: 上http://download.csdn.net/detail/u012329294/8280039 或者直接百度
安裝SourceInsight: http://rj.baidu.com/soft/detail/10258.html?ald 或者直接百度
配置SourceInsight能夠參考我去年寫的一篇SourceInsight安裝配置指南;
pclint主要配置是 std.lnt ---主入口
其中要配置一些其餘的.lnt文件,若是在以後的運行過程當中提示找不到lnt文件可是實際文件存在的狀況,能夠手動拷貝到std.lnt文件中; 在最後加上引用lib文件的路徑做爲頭文件引用路徑:
我這裏已經寫好了,你們直接拷貝就好了;
std.lnt文件我待會兒也會發在附件中;
二:將pclint集成到SourceInsight
html
1.打開Options中的Custom Commonds
2.隨意起個名字好比pclint;,再點擊Add
3.Run中填: C:\lint\lint-nt -u C:\lint\std.lnt C:\lint\env-vc6.lnt %f
4.勾選Iconic Window; Capture Output; Parse Links in OutPut; File,then Line; 4個選項
5.Close
6.打開MenuAssignments界面;輸入本身剛剛取的名字
7.在MenuAssignments界面選擇Menu ,選擇Help,選擇<end of menu>
8.點擊insert;
ios
9.你能夠看看在Help界面,有沒有出現剛剛你本身定義的名字
大功告成;
三.開始運行pclint了;
1.在SourceInsight中打開你想要檢查的cpp文件,
2.Help->pclint;開始執行了
3.執行完畢後會彈出link的分析界面
那就說明lint完畢了;
四.簡單分析下,拿本身代碼作例子吧;
1.上圖express
我圈了4個紅色的地方;
而後再來看看我寫的代碼:(提示:::點擊左邊的小紅箭頭能夠直接跳轉到指定代碼位置!!)
紅圈1: windows
能看出來後面的return FALSE; 是確定走不到的分支;
紅圈4:
服務器
這個比較嚴重,我發現個人stActiveSingle變量竟然沒有用過....
紅圈2:
代碼是指針的直接偏移指定字節數獲得結構體指針;仍是極可能野指針的,可是這個畢竟按照消息頭規則來的,那應該是沒問題;
紅圈3: 2
error 641: (Warning -- Converting enum 'TCBY_ENUM_ACTIVETYPE' to int)
不能直接把enum轉成int;
五.分析完畢app
附:lint文件內容:less
// Microsoft C and Visual C++ 6.x, -si4 -sp4, lib-w32.lnt
// Standard lint options
// co-msc60.lnt
// Compiler Options for Microsoft C Version 12.x
// (32 bit version)
-cmsc
-si4 // integers are 4 bytes
-sp4 // pointers are 4 bytes too.
-A(C++1997) // The C++ standard used was 1997,
// i.e., not the 2003 upgrade
// This file contains options to allow PC-lint to process source
// files for your compiler. It is used as follows:
//
// lint co-msc60.lnt source-file(s)
//
-d_M_IX86=300 // assume Intel 80386 architecture -- modify to suit
// We now support __declspec directly so that the following
// option is now commented out. If trouble ensues you can
// once again disable __declspec through this option.
// -d__declspec()= // ignore this construct
-d_declspec=__declspec // the single '_' version is occasionally used
// while processing compiler (library) header files ...
-wlib(1) // sets the warning level within library headers to 1
// (no warnings, just syntax errors). Comment out if you
// are actually linting library headers. This
// option makes obsolete options of the form -elib(axxx) where
// xxx >= 400 which may be retained for historical reasons.
-elib(19) // useless declarations (lone semicolons)
-elib(123) // function-like macro name used as non macro
-elib(652) // suppress message about #define of earlier declared symbols
-elib(762) // suppress message about multiple identical declarations and
-elib(760) // suppress message about multiple identical macro defs
-elib(514) // allow #if <boolean> | <boolean>
-elib(553) // undefined preprocessor variables assumed 0
-elib(1081) // suspicious object argument to an object parameter
-elib(726) // extraneous comma in enum definition
// SREGS, WORDREGS, BYTEREGS are defined in both bios.h and dos.h
// and accordingly you MAY get type differences based on 'origin'.
// If so, use the following options:
// -etd(origin)
// -elib(770)
-format=%(%f(%l)\s:\s%)%t\s%n:\s%m
// error format similar to MSC
// Note that %c can also be used to specify column
-e46 // allows bit-fields to be other than int or unsigned
+fan // allow anonymous unions
+fdi // Use directory of the including file
+fbo // enable the bool type
+fwm // wprintf format codes are not standard
-fdh // do not append a .h to header names
-ffb // do not establish a separate scope for declares within for clauses
-esym(123,min,max) // allows users to use min, max as variables
-d_MSC_VER=1200 // compiler version (in decimal)
+rw(__inline) // activate the __inline keyword
+ppw(import) // activate #import
-d_inline=__inline // _inline is the same as __inline
-sld10 // sizeof(long double) is 10.
-function(exit,_exit) // _exit() is like exit()
-function(exit,_assert) // _assert() is like exit()
-emacro(506,assert) // don't warn about constant value Boolean
-emacro(734,putc) // don't complain about items being too large.
-emacro(415,_FP_SEG) // access of out-of-bounds pointer
-emacro(740,FP_SEG,FP_OFF) // unusual casts
-emacro((???),va_arg) // the va_arg() macro can yield 415, 416, 661, 662
// 796 and 797 (out-of-bounds errors).
-emacro(413,offsetof) // use of NULL pointer creates a stir
-emacro(545,offsetof) // addressing an array member is OK
-emacro(845,RGB) // a common use of RGB uses a operator that produces a 0
-e793 // inhibit 'ANSI limit reached' --
// limits are impractically low with MSVC headers
-esym(628,eof) // failure to provide argument information for eof()
-esym(773,L_tmpnam) // defined with an unparenthesized '+'
-esym(438,_acp) // USES_CONVERSION assigns to _acp.
// The following functions exhibit variable return modes.
// That is, they may equally-usefully be called for a value
// as called just for their effects. Accordingly we inhibit
// Warning 534 for these functions.
// Feel free to add to or subtract from this list.
-esym(534,close,creat,fclose,fflush,_flsbuf,fprintf,fputc)
-esym(534,fputs,fscanf,fseek,fwrite,lseek,memcpy,memmove,memset)
-esym(534,printf,puts,scanf,sprintf,sscanf,strcat,strcpy)
-esym(534,strncat,strncpy,unlink,write)
// These are the wide char variants of printf-scanf family
-wprintf( 1, wprintf )
-wprintf( 2, fwprintf, swprintf )
-wscanf( 1, wscanf )
-wscanf( 2, fwscanf, swscanf )
// The following options are used to adjust our function mimicry to
// the actual library as provided by MS.
-function( wcstombs(1) ) // remove the check for a NULL first arg to wcstombs()
// The following options are required by most compilers to
// noiselessly process iostream.h
-elib(1717) //empty prototypes
-elib(522) //function return value ignored
-elib(1053) //prototypes cannot be distinguished
-elib(1721) //unusual operator =() declaration
-elib(1720) //assignment op has non-const parameter
-elib(655) // bitwise operator combining compatible enum's
-elib(641) // converting enum's to int
-elib(537) // repeated include file (ios.h)
-elib(1511) // member (rdbuf) hides nonvirtual member
-elib(1712) // default constructor not defined for class
-elib(1736) // redundant access specifier
-esym(1702,operator<<,operator>>) // both a member and an ordinary function
// These functions return things that are frequently ignored.
-esym(534,*operator<<,*operator>>)
// The following additional options seem to be needed.
-elib(506) // constant value Boolean
-elib(620) // el or one? (some constants end in 'l' not 'L')
-elib(648) // overflow in computing constant (3<<16)
-elib(659) // nothing follows '}' on some line
-elib(723) // suspicious use of '='
-elib(747) //significant prototype coercion
-elib(740) //unusual pointer casts
-elib(1007) // virtual functions within extern "C" block
-elib(1029) //default argument repeated -- can't dist. char, signed char
-elib(1055) //call to rdbuf() questioned?
-elib(1504) // apparently useless structs
-elib(1708,1709) // minor C/C++ declaration conflict
-elib(1707) // operator new declared w/o 'static'
-elib(1722) // assignment op does not return reference
-elib(149) // default argument found in C code.
-elib(578) // declaration of time hides delaration of global time().
-elib(761) // two equivalent typedef declarations
-elib(1065) // same name declared as "C" and not "C"
-elib(1066) // same name declared as "C" and not "C"
-elib(1704) // constructor with private access declaration
-elib(1735) // default parameter within virtual function
-elib(773) // macros that look like unparenthesized expressions
-elib(806) // 1-bit bitfields typed int
-elib(1501) // 0-length data members
-elib(1510) // base class has no destructor
-elib(1516) // data member hides inherited member
-elib(1509) // base class destructor is not virtual
// Special Notice: You may be receiving mysterious 1058 errors
// when you use "iomanipulator"s. For example:
// cout << setw(4) << 4;
// results in Error 1058 (assigning a const to a ref) because the
// manipulator setw returns a non-lvalue which is assigned to a reference.
// This reflects an oversight in the Microsoft header file: iomanip.h
// Therein you may change the declaration:
// friend ostream& operator<<(iostream& s, IOMANIP(T) & sm) { ...
// to:
// friend ostream& operator<<(iostream& s, const IOMANIP(T) & sm) { ...
// to reflect the fact that sm is not modified by this function.
-d_M_IX86=300 // define the architecture (one of _M_IX86, _M_ALPHA,
// _M_PPC, _M_MRX000)
-d_INTEGRAL_MAX_BITS=64 // denotes support for __int64
+fll // enable long long
-d__STDC__=0 // Starting with 2.0, the tests within Microsoft header
// files for __STDC__ are of the form #if rather than #ifdef
-dWIN32 // this is necessary because without WIN32 being defined
-d_WIN32 // a very gross syntax error is exposed in the objbase.h
// ... definition of function operator ==(). Alternatively,
// ... repair the function definition.
-dDBG=0 // There is a #if test made for this variable.
-d__FUNCTION__=___function___
// use Lint's built-in define
/* The option -d_NEW_ previously appearing in this spot is no longer
recommended as it nullifies the <new> header and because of this
prevents definition of 'bad_alloc' among other things.
*/
/* DLL's or Multithreads? Enable the following:
-d_AFXDLL // making a DLL
-d_DLL // ditto
-d_MT // multi-thread
*/
/* At one time we indicated that wchar_t was predefined by using
the option +fwc but then in order to keep the Microsoft headers
from redefining it we used the option -d_WCHAR_T_DEFINED.
But this in turned created a rare problem so now we just leave it
undefined.
*/
// In the following option we define __uuidof() and suppress
// Errors 50 and 69 and 1924 in exprs. containing same
-d"__uuidof()= /*lint --e(50,69,1924) */ (_GUID)0"
-esym(123,FD_SET) // defined as macro and as typedef
-esym(1726,endl,ends) // taking the address of an overloaded function
-esym(18,Data_t::Data_t) // definition not matching declaration
-elib(10) // expecting ')' -- comdef.h has a: #if defined( id
-elib(43) // vacuous array within _MIDL_FORMAT_STRING
-elib(602) // benign comment within comment
-elib(657) // declaring "anonymous struct" in union _LARGE_INTEGER
-elib(799) // long numerical constant for max. __int64
-elib(1502) // nothrow has no data members
-elib(1505) // no access specifier in base class specifier
-elib(1515) // AFX_THREAD_STATE member has no default constructor
-elib(1706) // Unusual declaration with a scope operator
-elib(1725) // data member is a reference
-elib(1548) // conflicting exception specifications
-elib(1737) // hiding global operator new
-elib(1739) // binary operator should be non-member function
-elib(1748) // non-virtual base class included twice
-elib(1759) // post-fix operator returns a reference
+e1942 // This Elective Note alerts the user to the non-standard
// way in which MS handles originally-dependent base classes.
// E.g. template<class T> class A : T { ... x ... };
// Should T be searched for "x" during instantiation?
// the standard says "no", MS does.
// Add elements of ole automation
// BSTR functions (part of OLE Automation)
-sem( SysAllocString, @p == malloc(1p) || @p == 0, 1p )
-sem( SysAllocStringByteLen, @P == malloc(2n+1) || @p == 0 )
-sem( SysAllocStringLen, @p == malloc(2n+1) || @p == 0 )
-sem( SysStringLen, 1p ? @n == 1p - 1 : @n == 0 )
-function( free, SysFreeString )
-d_stdcall=__stdcall // make _stdcall equivalent to __stdcall
// lib-w32.lnt
// PC-lint Library Options File for 32-bit mode windows.h
-d__FLAT__
-d_WIN32
-si4
-sp4
-esym(14,pLocalHeap) // variable defined in windows.h
-e740 // remove 'suspicious cast' messages because these must be
// routinely done within Windows.
-elib(46) // windows.h uses a BYTE as base of bit field.
-e793 // windows breaks ANSI limits
// the following functions have their return value typically ignored.
// add or subtract from this list as desired.
-esym(534,RegisterClass,ShowWindow,TranslateMessage,DispatchMessage)
-esym(534,DrawText,GetTextMetrics,ReleaseDC,TextOut,SetTextAlign)
-esym(534,SetScrollPos,SelectObject,SetBkMode,SendMessage,MessageBox)
-esym(534,MessageBoxA,MessageBoxW,PostMessageA,PostMessageW)
-esym(534,PatBlt,DeleteDC,SetCapture,SetCursor,StretchBlt)
-esym(534,Rectangle,MoveTo,LineTo,ShowCursor,MoveWindow,SetWindowWord)
-esym(534,SetPixel,FillRect,DeleteObject,KillTimer,GetProfileString)
-esym(534,SetWindowLong,SetFocus,SetBkColor,SetTextColor,SetBrushOrg)
-esym(534,UnrealizeObject,_lclose,Polygon,FrameRect,LoadString)
-esym(534,GetInstanceData,GlobalUnlock,FreeResource,LoadString)
-esym(534,DrawIcon,AppendMenu,GetObject,CheckMenuItem,SetClassWord)
-esym(534,EnableMenuItem,SetMenu,DestroyMenu,TrackPopupMenu)
-esym(534,AnsiUpper,Arc,BeginPaint,BitBlt,ChangeClipboardChain,Chord)
-esym(534,CloseClipboard,CombineRgn,DdeClientTransaction,DdeDisconnect)
-esym(534,DdeFreeStringHandle,DdeGetData,DdeNameService,DdePostAdvise)
-esym(534,DdeQueryString,DdeUninitialize,DeleteMenu,DeleteMetaFile)
-esym(534,DestroyWindow,DialogBox,DPtoLP,Ellipse,EmptyClipboard,EnableWindow)
-esym(534,EnumChildWindows,EnumWindows,Escape,GetClassName,GetDlgItemText)
-esym(534,GetFileTitle,GetMenuString,GetStrings,GetSystemMenu,GetTextFace)
-esym(534,GetWindowText,GlobalDeleteAtom,GlobalFree,GlobalGetAtomName)
-esym(534,LocalFree,LocalUnlock,LockResource,lstrcpy,OpenClipboard)
-esym(534,Pie,PlayMetaFile,PopFindNextText,PostDataMessage,PostMessage)
-esym(534,RestoreDC,SaveDC,SelectClipRgn,SendDlgItemMessage,SetClipboardData)
-esym(534,SetDIBitsToDevice,SetMapMode,SetMapperFlags,SetROP2,SetStretchBltMode)
-esym(534,SetTextJustification,SetTimer,SetViewportExt,SetViewportOrg)
-esym(534,SetWindowExt,SetWindowOrg,StretchDIBits,WinExec)
// Ignored parameters
-esym(715,lpszCmdParam,lpszCmdLine)
-emacro(648,PSN_*) // ignore unsigned overflow (0-200U)ide