
å
æ¥ãObjectArtsã¯ãœãŒã¹ãå®å
šã«ãªãŒãã³ããèšèªãšéçºç°å¢Dolphin SmalltalkããªãŒãã³ã©ã€ã»ã³ã¹MITã§ãªãªãŒã¹ããŸããïŒ PVS-Studioã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšããŠãã®ãããžã§ã¯ããæ€èšŒããããšãªããç§ã¯éãéããããšãã§ããŸããã§ããã éçºè
ãé«å質ã®ã³ãŒããäœæã§ããããšãç¥çŠã§ããŸãã é倧ãªãšã©ãŒã¯èŠã€ãããŸããã§ããã ãã ãããã€ãã®ããã«ãå€ãã®ãã°ãšæªèãæŸã€ã³ãŒãããããŸãã ãã®èšäºã§ã³ãŒããå°ãè¯ããªãããšãé¡ã£ãŠããŸãã
ãããžã§ã¯ãã«ã€ããŠ
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
ã»ãšãã©ã®å Žåãããã«ã¯ãšã©ãŒã¯ãããŸããããã³ãŒãã¯çãããã§ãã é
åã®èŠçŽ ã¯ãããããã®èŠçŽ ã®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
ããã°ã©ããŒã¯ãããã©ã°ãèŠåïŒããã©ã«ãïŒ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];
ããã©ã«ãã§ã¯ãã¿ã€ãã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;
ãã®å Žåããã®èŠåã¯å©èšã§ãã ã©ãã§ã倿° 'specialCase'ãè«ç倿°ã®ããã«æ©èœããå Žåãããã«ã¯æšæºå 'bool'ã䜿çšããããšããå§ãããŸãã
ãããã«
å¥ã®ãããžã§ã¯ããããã¹ããã
ãªãŒãã³ãããžã§ã¯ãã®ãªã¹ãã«è¿œå ãããŸããã
ãã®ãããªèšäºãæºåããããšã«ãããéçã¢ãã©ã€ã¶ãŒãæäŸãããã¹ãŠã®èŠåããã¯ã»ã©é ãæ
å ±ãåŒçšããŠããŸãã ãããã£ãŠããããžã§ã¯ãã®äœæè
ãç¬èªã«åæãå®è¡ããã¢ãã©ã€ã¶ãŒã«ãã£ãŠçºè¡ããããã¹ãŠã®ã¡ãã»ãŒãžã調æ»ããããšããå§ãããŸãã
ãããŠãã€ãã®ããã«ãã¢ãã©ã€ã¶ãŒã®äŸ¡å€ã¯åäžã®ãã§ãã¯ã§ã¯ãªããéåžžã®äœ¿çšã«ããããšãèªè
ã«æãåºãããŸãã
è±èªã話ãèŽè¡ãšãã®èšäºãå
±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒSvyatoslav Razmyslovã
Dolphin Smalltalk 7ã®ãœãŒã¹ã³ãŒããå
¬éããããã®ãªããŒãžã¥ ã