
ãããžã§ã¯ãã«ã€ããŠ
Dolphin Smalltalkã¯ãWindowsçšã®ç¬èªã®Smalltalkæ¹èšã®éçºç°å¢ã§ãã äž»ãªæ©èœã¯ãCOMãActiveXãªã©ã®ãã€ãã£ããŠã£ãžã§ããããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ãµãã·ã¹ãã ãšã®ç·å¯ãªçµ±åãèŠæ ãã®è¯ãã°ã©ãã£ãã¯ãã¶ã€ã³ã§ãã
é·ãéãDolphin Smalltalkã«ã¯2ã€ã®ããŒãžã§ã³ããããŸãããã·ã§ã¢ãŠã§ã¢éå®ããŒãžã§ã³ïŒã³ãã¥ããã£ãšãã£ã·ã§ã³ïŒãšãããã§ãã·ã§ãã«éçºçšã®ææããã±ãŒãžã§ãã åŸè ã¯ãé«åºŠãªãšãã£ã¿ãŒãã¹ã¿ã³ãã¢ãã³ã¢ãŒãã§ã®å ¬éã¢ããªã±ãŒã·ã§ã³ãå«ããã¹ãŠã®æ©èœãžã®ã¢ã¯ã»ã¹ãæäŸããŸããããçŽ400ãã«ã®è²»çšãããããŸããã
PVS-Studio 6.00ã䜿çšããŠããªãŒãã³ãœãŒã¹ã®Dolphin Smalltalk Virtual Machineãæ€èšŒãããŸããã 以äžã¯ãéçã¢ãã©ã€ã¶ãŒã«ããæ€èšŒã®çµæã§ãã DolphinVMãããžã§ã¯ãã¯éåžžã«å°ãããšããäºå®ã«ããããããããã®ã³ãŒãã«ã¯äŸç¶ãšããŠçãããå ŽæããããŸãã
æ€èšŒçµæ
èŠåN1ïŒ V611ã¡ã¢ãªã¯ 'new T []'æŒç®åã䜿çšããŠå²ãåœãŠãããŸãããã 'delete'æŒç®åã䜿çšããŠè§£æŸãããŸããã ãã®ã³ãŒãã調ã¹ãããšãæ€èšããŠãã ããã ãdelete [] msg;ãã䜿çšããæ¹ãããããè¯ãã§ãããã compiler.cpp 379
Compiler::StaticType Compiler::FindNameAsStatic(....) { .... char* msg = new char[strlen(szPrompt)+name.size()+32]; ::wsprintf(msg, szPrompt, name.c_str()); char szCaption[256]; ::LoadString(GetResLibHandle(), IDR_COMPILER, szCaption, ....); int answer = ::MessageBox(NULL, msg, szCaption, ....); delete msg; //<==?? .... }
ã¢ãã©ã€ã¶ãŒã¯ãã¡ã¢ãªãŒãäºææ§ã®ãªãæ¹æ³ã§å²ãåœãŠããã解æŸããããšããäºå®ã«é¢é£ãããšã©ãŒãæ€åºããŸããã
ãnew []ãæŒç®åãåŒã³åºããåŸããdelete []ãæŒç®åã䜿çšããŠã¡ã¢ãªã解æŸããå¿ èŠããããŸãã
èŠåN2 ïŒ V716 returnã¹ããŒãã¡ã³ãã§ã®çãããåå€æïŒBOOLãè¿ããŸããããé¢æ°ã¯å®éã«HRESULTãè¿ããŸãã idolphinstart.cpp 78
#define STDMETHODIMP HRESULT STDMETHODCALLTYPE STDMETHODIMP CDolphinSmalltalk::GetVersionInfo(LPVOID pvi) { extern BOOL __stdcall GetVersionInfo(VS_FIXEDFILEINFO* ....); return ::GetVersionInfo(static_cast<VS_FIXEDFILEINFO*>(pvi)); }
ãã®ã³ãŒãã¹ããããã§ã¯ãã¿ã€ããBOOLããã¿ã€ããHRESULTãã«æé»çã«ãã£ã¹ããããŸãã ãã®ãããªæäœã¯ãC ++èšèªã®èŠ³ç¹ããã¯ååã«åãå ¥ããããŸãããå®éçãªæå³ã¯ãããŸããã HRESULTåã¯ã¹ããŒã¿ã¹ã®ä¿åãç®çãšããŠãããããªãè€éãªåœ¢åŒãæã¡ãBOOLåãšã¯é¢ä¿ãããŸããã
èŠåN3 ïŒ V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ãelemsãã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã compiler.cpp 2922
POTE Compiler::ParseByteArray() { NextToken(); while (m_ok && !ThisTokenIsClosing()) { if (elemcount>=maxelemcount) { _ASSERTE(maxelemcount > 0); maxelemcount *= 2; elems = (BYTE*)realloc(elems, maxelemcount*sizeof(BYTE)); } .... } .... }
ãã®ã³ãŒãã¯æœåšçã«å±éºã§ããreallocïŒïŒé¢æ°ã®çµæãå¥ã®å€æ°ã«ä¿åããããšããå§ãããŸãã reallocïŒïŒé¢æ°ã¯ãã¡ã¢ãªãããã¯ã®ãµã€ãºãå€æŽããŸãã çŸåšã¡ã¢ãªãããã¯ã®ãµã€ãºãå€æŽã§ããªãå Žåãé¢æ°ã¯NULLãã€ã³ã¿ãŒãè¿ããŸãã äž»ãªåé¡ã¯ããptr = reallocïŒptrã...ïŒããšãã圢åŒã®æ§é ã䜿çšãããšããã®ããŒã¿ãããã¯ãžã®ptrãã€ã³ã¿ãŒã倱ãããå¯èœæ§ãããããšã§ãã
åæ§ã®å±éºãªå ŽæïŒ
- V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ãŒ 'm_pAllocations'ã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã alloc.cpp 436
- V701 reallocïŒïŒãªãŒã¯ã®å¯èœæ§ïŒreallocïŒïŒãã¡ã¢ãªã®å²ãåœãŠã«å€±æãããšãå ã®ãã€ã³ã¿ãpUnmarkedãã倱ãããŸãã reallocïŒïŒãäžæãã€ã³ã¿ãŒã«å²ãåœãŠãããšãæ€èšããŠãã ããã gc.cpp 217
èŠåN4 ïŒ V547åŒ 'i> = 0'ã¯åžžã«çã§ãã 笊å·ãªãã®åã®å€ã¯åžžã«> = 0ã§ããcompact.cpp 35
// Answer the index of the last occuppied OT entry unsigned __stdcall ObjectMemory::lastOTEntry() { HARDASSERT(m_pOT); // HARDASSERT(m_nInCritSection > 0); unsigned i = m_nOTSize-1; const OTE* pOT = m_pOT; while (pOT[i].isFree()) { ASSERT(i >= 0); i--; } return i; }
ã»ãšãã©ã®å Žåãããã«ã¯ãšã©ãŒã¯ãããŸããããã³ãŒãã¯çãããã§ãã é åã®èŠçŽ ã¯ãããããã®èŠçŽ ã®isFreeïŒïŒé¢æ°ãfalseãè¿ããŸã§é çªã«æ€çŽ¢ãããŸãã ããã§ééã£ãŠããã®ã¯ASSERTã§ãã 圌ã¯æ¬åœã«äœããã§ãã¯ããŸããã å€æ° 'i'ã¯ç¬Šå·ãªãã§ããã€ãŸããåžžã«0以äžã§ãã
笊å·ãªãåãšã®å¥ã®æ¯èŒ '> = 0'ïŒ
- V547åŒã¯åžžã«çã§ãã 笊å·ãªãã®åã®å€ã¯åžžã«> = 0ã§ããloadimage.cpp 343
èŠåN5 ïŒ V730ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒå ã§åæåãããããã§ã¯ãããŸããã æ€æ»ãæ€èšããŠãã ããïŒm_dwSizeã imagefilemapping.h 13
class ImageFileMapping { HANDLE m_hFile; HANDLE m_hMapping; LPVOID m_pData; DWORD m_dwSize; public: ImageFileMapping() : m_hFile(0), m_hMapping(0), m_pData(NULL){} ~ImageFileMapping() { Close(); } .... };
æœåšçã«å±éºãªã³ãŒãã®å¥ã®ã±ãŒã¹ã ImageFileMappingã¯ã©ã¹ã«ã¯4ã€ã®ãã£ãŒã«ãããå«ãŸããŠããŸããããã³ã³ã¹ãã©ã¯ã¿ãŒã§åæå€ãå²ãåœãŠãããã®ã¯ãã®ãã¡3ã€ã ãã§ãã ã¡ã³ã㌠'m_dwSize'ã¯åæåãããŠããªããŸãŸã§ãã
ããã¯ãé åãžã®ãã€ã³ã¿ããŸã ãŒãã®å Žåãã¯ã©ã¹ãããµã€ãºãã§åäœããªãå Žåã®ããªãäžè¬çãªæ¹æ³ã§ãã ãã ããééããç¯ãã®ã¯éåžžã«ç°¡åãªã®ã§ãã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãåæåããããšããå§ãããŸãã
åæ§ã®ã¯ã©ã¹ïŒ
- V730ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒå ã§åæåãããããã§ã¯ãããŸããã æ€æ»ãæ€èšããŠãã ããïŒm_flagsãm_oopWorkspacePoolsãm_contextãm_compiledMethodClassã compiler.cpp 84
- V730ã¯ã©ã¹ã®ãã¹ãŠã®ã¡ã³ããŒãã³ã³ã¹ãã©ã¯ã¿ãŒå ã§åæåãããããã§ã¯ãããŸããã æ€æ»ãæ€èšããŠãã ããïŒm_tokenTypeãm_integerãtpãm_ccãm_baseã lexer.cpp 40
èŠåN6 ïŒ V665ãã®ã³ã³ããã¹ãã§ã¯ããïŒpragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãééã£ãŠããå¯èœæ§ããããŸãã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªïŒ99ã101ãcompact.cpp 101
// Perform a compacting GC size_t ObjectMemory::compact() { .... #pragma warning (disable : 4127) while(true) #pragma warning (default : 4127) .... }
ããã°ã©ããŒã¯ãããã©ã°ãèŠåïŒããã©ã«ãïŒXïŒããã£ã¬ã¯ãã£ãã®åŸãããã©ã°ãèŠåïŒç¡å¹ïŒXïŒãã䜿çšããŠä»¥åã«ç¡å¹ã«ãããèŠåãåã³åäœãéå§ãããšä¿¡ããŠããŸãã ããã§ã¯ãããŸããã ããã©ã°ãèŠåïŒããã©ã«ãïŒXïŒããã£ã¬ã¯ãã£ãã¯ãçªå·ãXãã®èŠåãããã©ã«ãã®ç¶æ ã«èšå®ããŸãã ããã¯åãããšããã¯ã»ã©é ãã
ã³ãŒãã®æ£ããããŒãžã§ã³ïŒ
size_t ObjectMemory::compact() { .... #pragma warning(push) #pragma warning (disable : 4127) while(true) #pragma warning(pop) .... }
ãã®ãããã¯ã«é¢ããè¯ãèšäºïŒã ã ãããVisual C ++ã§ãã®èŠåãããæ¶ããã ã
ãã®ãããªå Žæã®å šãªã¹ãïŒ
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ244ã246ãexpire.cpp 246
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ226ã241ãexpire.cpp 241
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã ãã§ãã¯è¡ïŒ126ã128ãinterfac.cpp 128
- V665ããããããã®ã³ã³ããã¹ãã§ã¯ã#pragma warningïŒdefaultïŒXïŒãã®äœ¿çšæ³ãæ£ãããããŸããã 代ããã«ã#pragma warningïŒpush / popïŒãã䜿çšããå¿ èŠããããŸãã è¡ã確èªããŠãã ããïŒ385ã387ãinterprt.cpp 387
èŠåN7 ïŒ V576圢åŒãæ£ãããããŸãã ã 'wsprintfA'é¢æ°ã®4çªç®ã®å®åŒæ°ã確èªããããšãæ€èšããŠãã ããã ãã€ã³ã¿ãŒã®å€ãåºåããã«ã¯ããïŒ pãã䜿çšããå¿ èŠããããŸãã interfac.cpp 679
inline DWORD __stdcall Interpreter::GenericCallbackMain(SMALLINTEGER id, BYTE* lpArgs) { .... #ifdef _DEBUG { char buf[128]; wsprintf(buf, "WARNING: .... (%d, %x)\n", id, lpArgs); WarningWithStackTrace(buf); } #endif .... }
å€ãã®å Žåã 'ïŒ x'修食åã䜿çšããŠãã€ã³ã¿ãŒã®å€ãåºåããããšããŸãã
ãã®ã³ãŒãã¯ããã€ã³ã¿ãŒã®ãµã€ãºã 'int'åã®ãµã€ãºãšäžèŽããã·ã¹ãã ã§ã®ã¿æ©èœããããã誀ãã§ãã ãŸããããšãã°ãWin64ã§ã¯ããã®ã³ãŒãã¯æ¢ã«ãptrããã€ã³ã¿ãŒã®äžéšã®ã¿ãåºåããŸãã ãã®å Žåã修食å 'ïŒ p'ã䜿çšããå¿ èŠããããŸãã
èŠåN8 ïŒ V547åŒ 'ch> 127'ã¯åžžã«falseã§ãã charåã®å€ã®ç¯å²ïŒ[-128ã127]ã decode.cpp 55
ostream& operator<<(ostream& stream, const VariantCharOTE* oteChars) { .... char ch = string->m_characters[i]; //if (ch = '\0') break; if (ch < 32 || ch > 127) //<== { static char hexChars[16+1] = "0123456789ABCDEF"; .... } .... }
ããã©ã«ãã§ã¯ãã¿ã€ããcharãã®å€ã®ç¯å²ã¯[-127; 127]ã§ãã ã³ã³ãã€ã«ãã©ã°/ Jã䜿çšãããšãç¯å²[0; 255]ã䜿çšããããã³ã³ãã€ã©ãŒã«æ瀺ã§ããŸãã ãã ãããã®ãœãŒã¹ãã¡ã€ã«ãã³ã³ãã€ã«ããå Žåããã®ãããªãã©ã°ã¯æå®ãããŠããªãããããch> 127ãããã§ãã¯ããŠãæå³ããããŸããã
èŠåN9 ïŒ V688 'prev'é¢æ°ã®åŒæ°ã¯ãã¯ã©ã¹ã¡ã³ãã®1ã€ãšåãååãæã£ãŠãããããæ··ä¹±ãæãå¯èœæ§ããããŸãã thrdcall.h 126
void LinkAfter(T* prev) { T* pThis = static_cast<T*>(this); this->next = prev->next; if (this->next) this->next->prev = pThis; this->prev = prev; prev->next = pThis; }
ã»ãšãã©ã®å Žåããã®é¢æ°ã«ééãã¯ãããŸããããã¯ã©ã¹é¢æ°ãšã¯ã©ã¹ã¡ã³ããŒã®ãã©ã¡ãŒã¿ãŒãåãååã§åŒã³åºãããšã¯ãã³ãŒããèšè¿°ããã®ã«ããŸãè¯ãã¹ã¿ã€ã«ã§ã¯ãããŸããã ããã«ãããã¿ã€ããã¹ãçºçããå¯èœæ§ãããããã®ãããééã£ãå€æ°ã®å€ã䜿çšãŸãã¯å€æŽãããŸãã
èŠåN10 ïŒ V601 ãfalseãå€ã¯æé»çã«æŽæ°åã«ãã£ã¹ããããŸãã compiler.cpp 1940
int Compiler::ParseUnaryContinuation(...., int textPosition) { int continuationPointer = m_codePointer; MaybePatchLiteralMessage(); while (m_ok && (ThisToken()==NameConst)) { int specialCase=false; //<== .... if (!specialCase) //<== { int sendIP = GenMessage(ThisTokenText(), 0, textPosition); AddTextMap(sendIP, textPosition, ThisTokenRange().m_stop); } .... } .... }
ãã®å Žåããã®èŠåã¯å©èšã§ãã ã©ãã§ãå€æ° 'specialCase'ãè«çå€æ°ã®ããã«æ©èœããå Žåãããã«ã¯æšæºå 'bool'ã䜿çšããããšããå§ãããŸãã
ãããã«
å¥ã®ãããžã§ã¯ããããã¹ããããªãŒãã³ãããžã§ã¯ãã®ãªã¹ãã«è¿œå ãããŸããã
ãã®ãããªèšäºãæºåããããšã«ãããéçã¢ãã©ã€ã¶ãŒãæäŸãããã¹ãŠã®èŠåããã¯ã»ã©é ãæ å ±ãåŒçšããŠããŸãã ãããã£ãŠããããžã§ã¯ãã®äœæè ãç¬èªã«åæãå®è¡ããã¢ãã©ã€ã¶ãŒã«ãã£ãŠçºè¡ããããã¹ãŠã®ã¡ãã»ãŒãžã調æ»ããããšããå§ãããŸãã
ãããŠãã€ãã®ããã«ãã¢ãã©ã€ã¶ãŒã®äŸ¡å€ã¯åäžã®ãã§ãã¯ã§ã¯ãªããéåžžã®äœ¿çšã«ããããšãèªè ã«æãåºãããŸãã
è±èªã話ãèŽè¡ãšãã®èšäºãå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒSvyatoslav Razmyslovã Dolphin Smalltalk 7ã®ãœãŒã¹ã³ãŒããå ¬éããããã®ãªããŒãžã¥ ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã