
ã»ãŒ3ãæéã2018幎ã¯ãã§ã«çªã®å€ã«ãããŸãããã€ãŸããéå»1幎éã«C ++ãããžã§ã¯ãã§PVS-Studioã¢ãã©ã€ã¶ãŒã«ãã£ãŠæ€åºãããäžäœ10åã®ãšã©ãŒãã³ã³ãã€ã«ãããšããæ¥ãŸããïŒå°ãé ããŠããŸãïŒã ããã§ã¯å§ããŸãããïŒ
ã泚æ ããã«èå³ãããå Žåã¯ããŸãã³ãŒãã¹ããããã§ãšã©ãŒãèŠã€ããŠãããã¢ãã©ã€ã¶ãŒã®èŠåãšèª¬æãèªãã§ãã ããã ãã£ãšé¢çœããšæããŸãã
10äœ
ãœãŒã¹ïŒ ã¡ã¢åž³++ïŒ5幎åŸã®ã³ãŒããã§ãã¯
æãæåãªããã¹ããšãã£ã¿ã®1ã€ã§ããNotepad ++ã®ãã§ãã¯äžã«ãšã©ãŒãçºèŠãããŸããã
ãšã©ãŒãå«ãã³ãŒãã¹ããããïŒ
TCHAR GetASCII(WPARAM wParam, LPARAM lParam) { int returnvalue; TCHAR mbuffer[100]; int result; BYTE keys[256]; WORD dwReturnedValue; GetKeyboardState(keys); result = ToAscii(static_cast<UINT>(wParam), (lParam >> 16) && 0xff, keys, &dwReturnedValue, 0); returnvalue = (TCHAR) dwReturnedValue; if(returnvalue < 0){returnvalue = 0;} wsprintf(mbuffer, TEXT("return value = %d"), returnvalue); if(result!=1){returnvalue = 0;} return (TCHAR)returnvalue; }
PVS-StudioèŠå ïŒ V560æ¡ä»¶åŒã®äžéšã¯åžžã«çã§ãïŒ0xffã babygrid.cpp 711
ã¢ãã©ã€ã¶ãŒã¯åŒïŒlParam >> 16ïŒ&& 0xffãçããããšå€æããŸãã ã ToAsciié¢æ°ã«æž¡ããã2çªç®ã®åŒæ°ã®å€ã¯åžžã«0ãŸãã¯1ã§ãããçµæã®å€ã¯å·Šã®éšååŒ- ïŒlParam >> 16ïŒã®ã¿ã«äŸåããŸãã æããã«ã&&æŒç®åã®ä»£ããã«ïŒæŒç®åã䜿çšããå¿ èŠããããŸããã
9äœ
åºå žïŒ Yandexã®éçºè ã«æšæ¶ãéããŸã
9äœã¯ãYandexãéçºããClickHouseãããžã§ã¯ãã®ãšã©ãŒã§ãã
bool executeForNullThenElse(....) { .... const ColumnUInt8 * cond_col = typeid_cast<const ColumnUInt8 *>(arg_cond.column.get()); .... if (cond_col) { .... } else if (cond_const_col) { .... } else throw Exception( "Illegal column " + cond_col->getName() + " of first argument of function " + getName() + ". Must be ColumnUInt8 or ColumnConstUInt8.", ErrorCodes::ILLEGAL_COLUMN); .... }
PVS-StudioèŠå ïŒ V522ãã«ãã€ã³ã¿ãŒ 'cond_col'ã®éåç §ãè¡ãããå ŽåããããŸãã FunctionsConditional.h 765
ãã®ã³ãŒãã§ã¯ãäŸå€ãã¹ããŒããå¿ èŠããããšãã«ãšã©ãŒç¶æ³ã誀ã£ãŠåŠçãããŸãã cond_colãã€ã³ã¿ãŒã«æ³šæããŠãã ãã ã ãã®ããã«ã ifã¹ããŒãã¡ã³ãã¯ãã€ã³ã¿ãŒããŒã以å€ã§ããããšããã§ãã¯ããŸãã äŸå€ãã¹ããŒãããelseãã©ã³ãã«å¶åŸ¡ãå°éããå Žåã cond_colãã€ã³ã¿ãŒã¯æ£ç¢ºã«nullã§ãã ãã ããäŸå€ã¡ãã»ãŒãžãçæããå Žåã cond_colã¯åŒcond_col-> getNameïŒïŒã§éæ¥åç §ãããŸãã
8äœ
åºå žïŒ FirebirdãMySQLãPostgreSQLã®ã³ãŒãå質æ¯èŒ
8äœã¯ãFirebirdãMySQLãPostgreSQLã®ã³ãŒãã®å質ãæ¯èŒãããšãã«ãMySQLãããžã§ã¯ãã§èŠã€ãã£ããšã©ãŒã®1ã€ã§ãã
ãšã©ãŒãå«ãã¡ãœããã®ã³ãŒãïŒ
mysqlx::XProtocol* active() { if (!active_connection) std::runtime_error("no active session"); return active_connection.get(); }
PVS-StudioèŠå ïŒ V596ãªããžã§ã¯ãã¯äœæãããŸãããã䜿çšãããŠããŸããã ãthrowãããŒã¯ãŒããæ¬ èœããŠããå¯èœæ§ããããŸãïŒthrow runtime_errorïŒFOOïŒ; mysqlxtest.cc 509
ã¢ã¯ãã£ããªæ¥ç¶ïŒ ïŒActive_connection ïŒããªãå Žåã¯ã std :: runtime_errorã¿ã€ãã®äŸå€ãªããžã§ã¯ããäœæãããŸã...ããã ãã§ãã äœæåŸãã¡ãœããã¯åã«åé€ãããŸãããã¡ãœããã®å®è¡ã¯ç¶ç¶ãããŸãã æããã«ãéçºè ã¯äŸå€ãã¹ããŒããããã«throwããŒã¯ãŒããå¿ããŠããŸããã
7äœ
ãœãŒã¹ïŒ FreeBSDã³ãŒãã®56ã®æœåšçãªè匱æ§ãäžæ©ã§èŠã€ããæ¹æ³
å€æ¹ã«56ã®æœåšçãªè匱æ§ãèŠã€ããæ¹æ³ïŒ ãã¡ãããéç解æã§ã¯ïŒ
FreeBSDã³ãŒãã§èŠã€ãã£ãåé¡ã®1ã€ïŒ
int mlx5_core_create_qp(struct mlx5_core_dev *dev, struct mlx5_core_qp *qp, struct mlx5_create_qp_mbox_in *in, int inlen) { .... struct mlx5_destroy_qp_mbox_out dout; .... err_cmd: memset(&din, 0, sizeof(din)); memset(&dout, 0, sizeof(dout)); din.hdr.opcode = cpu_to_be16(MLX5_CMD_OP_DESTROY_QP); din.qpn = cpu_to_be32(qp->qpn); mlx5_cmd_exec(dev, &din, sizeof(din), &out, sizeof(dout)); return err; }
PVS-StudioèŠå ïŒ V597ã³ã³ãã€ã©ã¯ããdoutããªããžã§ã¯ãã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã ãã©ã€ããŒãããŒã¿ãæ¶å»ããã«ã¯ãmemset_sïŒïŒé¢æ°ã䜿çšããå¿ èŠããããŸãã mlx5_qp.c 159
åŒmemsetïŒïŒdoutã0ãsizeofïŒdoutïŒïŒã«æ³šæããŠãã ããã éçºè ã¯ã doutã«å¯Ÿå¿ããã¡ã¢ãªãããã¯å ã®ããŒã¿ããæ¶å»ãããŠãå€ããŒãã«èšå®ããããšèããŠããŸããã éåžžããã®ã¢ãããŒãã¯ãã¡ã¢ãªã«ããã³ã°ãããªãããã«ãã©ã€ããŒãããŒã¿ãã¯ãªã¢ããå¿ èŠãããå Žåã«äœ¿çšãããŸãã
ãã ãã doutã¯ãã以äžäœ¿çšãããŸããïŒ sizeofïŒdoutïŒã¯ã«ãŠã³ããããŸããïŒãããã«ãããã³ã³ãã€ã©ã¯äžèšã®memseté¢æ°åŒã³åºããåé€ã§ããŸãã ãã®ãããªæé©åã¯ãC / C ++ã®èŠ³ç¹ããèŠãããã°ã©ã ã®åäœã«ã¯åœ±é¿ããŸããã ãã®çµæãã¯ãªã¢ãããã¹ãããŒã¿ãã¡ã¢ãªã«æ®ãå ŽåããããŸãã
ãã®ãããã¯ãããã«æ·±ãæãäžããã«ã¯ã次ã®èšäºãèªãããšããå§ãããŸãã
- ãã©ã€ããŒãããŒã¿ãå®å šã«æ¶å»ããŸã ã
- 蚺æã«ãŒã«V597ã®ããã¥ã¡ã³ã ã
- C / C ++ã®äžçã§æãå±éºãªé¢æ° ã
6äœ
åºå žïŒ åŸ æã®CryEngine Vãã¹ã
ãã®ãããã§åãäžããã³ãŒã-CryEngineVã
int CTriMesh::Slice(....) { .... bop_meshupdate *pmd = new bop_meshupdate, *pmd0; pmd->pMesh[0]=pmd->pMesh[1] = this; AddRef();AddRef(); for(pmd0=m_pMeshUpdate; pmd0->next; pmd0=pmd0->next); pmd0->next = pmd; .... }
PVS-StudioèŠå ïŒ V529å¥æ°ã»ãã³ãã³ ';' ãforãæŒç®åã®åŸã boolean3d.cpp 1314
ãã®ãã©ã°ã¡ã³ãããã®ããã«æžãåºãããŠããªãå Žå-ççž®ãããã³ãŒãã®æ®ãã®éšåããåé¢ãããŠããå Žåãã¢ãã©ã€ã¶ãŒãèŠã€ããçãããã»ã¯ã·ã§ã³-forã«ãŒããçµäºããã·ã³ãã« ';'ãèŠã€ããã®ã¯ããã»ã©ç°¡åã§ã¯ãªãããšã«åæããŸãã åæã«ãã³ãŒãããã©ãŒãããããïŒæ¬¡ã®åŒãã·ããããïŒããšããã·ã³ãã« ';'ã瀺åããŠããŸãã ããã¯äžèŠã§ããåŒpmd0-> next = pmd; ãµã€ã¯ã«ã®æ¬äœã§ãªããã°ãªããŸããã ãããã forã«ãŒãã®ããžãã¯ããå€æãããšãæ··ä¹±ãæãã®ã¯ã³ãŒãã®èª€ã£ããã©ãŒãããã§ãããè«ççãªãšã©ãŒã§ã¯ãããŸããã ã¡ãªã¿ã«ãCryEngineã³ãŒãã§ã¯ãã³ãŒãã®ãã©ãŒããããä¿®æ£ãããŠããŸãã
5äœ
åºå žïŒ Unreal Engineéçºããã»ã¹ã®äžéšãšããŠã®éçåæã
Unreal Engineã²ãŒã ãšã³ãžã³ã®ã³ãŒãã§PVS-Studioãæ€åºãããšã©ãŒã®ä¿®æ£äœæ¥äžã«ã次ã®ãšã©ãŒãçºèŠãããŸããã
for(int i = 0; i < SelectedObjects.Num(); ++i) { UObject* Obj = SelectedObjects[0].Get(); EdObj = Cast<UEditorSkeletonNotifyObj>(Obj); if(EdObj) { break; } }
PVS-StudioèŠå ïŒ V767ã«ãŒãå ã®å®æ°ã€ã³ããã¯ã¹ã«ãããSelectedObjectsãé åã®èŠçŽ ãžã®çãããã¢ã¯ã»ã¹ã skeletonnotifydetails.cpp 38
ã«ãŒãã§ã¯ããã¹ãŠã®èŠçŽ ã調ã¹ãŠããã®äžã§UEditorSkeletonNotifyObjåã®æåã®èŠçŽ ãèŠã€ããããšèããŸããã ããããã«ãŒãã«ãŠã³ã¿ãŒiã®ä»£ããã«SelectedObjects [0] .GetïŒïŒåŒã§å®æ°ã€ã³ããã¯ã¹0ã䜿çšããããšã«ãããäžå¹žãªãã¹ãç¯ããŸããã ãã®çµæãæåã®èŠçŽ ã®ã¿ãåžžã«ãã§ãã¯ãããŸãã
4äœ
åºå žïŒ Tizenãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®27,000ãšã©ãŒ
Tizenãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ãšãã®äžã§äœ¿çšãããŠãããµãŒãããŒãã£ã®ã³ã³ããŒãã³ãããã§ãã¯ããŠãããšãã«ãšã©ãŒãèŠã€ãããŸããã ãã®èšäºã¯å€§ãããå€ãã®èå³æ·±ããšã©ãŒäŸãå«ãŸããŠããŸã-èªãããšã匷ããå§ãããŸãã
ãã ããç¹å®ã®èŠåã«æ»ããŸãã
int _read_request_body(http_transaction_h http_transaction, char **body) { .... *body = realloc(*body, new_len + 1); .... memcpy(*body + curr_len, ptr, body_size); body[new_len] = '\0'; curr_len = new_len; .... }
PVS-StudioèŠå ïŒ V527 ã\ 0ãå€ããcharãåãã€ã³ã¿ãŒã«å²ãåœãŠãããŠããã®ã¯å¥åŠã§ãã ããããæå³ïŒ* body [new_len] = '\ 0'ã http_request.c 370
ãšã©ãŒã¯åŒæ¬äœ[new_len] = '\ 0'ã«ãããŸãã bodyãã©ã¡ãŒã¿ãŒã¯ããããchar **åã§ãããåŒbody [new_len]ã®åã¯char *ã§ããããšã«æ³šæããŠãã ããã ããããéçºè ã¯å€§å€±æããå¥ã®éåç §ãå¿ããŠããã€ã³ã¿ãŒã«å€ã\ 0ããæžã蟌ãããšããŸããïŒnullãã€ã³ã¿ãŒã«å€æãããŸãïŒã
ããã¯2ã€ã®åé¡ã«ã€ãªãããŸãã
- ã©ããïŒ body [new_len] ïŒnullãã€ã³ã¿ãŒãæžã蟌ãŸããŸãã
- çµç«¯ã®ãŒãã¯è¡æ«ã«æžã蟌ãŸããŸããã
æ£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
(*body)[new_len] = '\0';
3äœ
åºå žïŒ PVS-Studioã¯è匱æ§ã®æ€çŽ¢ã«ã©ã®ããã«åœ¹ç«ã¡ãŸããïŒ
ã ããç§ãã¡ã¯ããã3ã«å°éããŸããã 次ã®ã³ãŒãã¯ããPVS-Studioã¯CVEæ€çŽ¢ã«ã©ã®ããã«å¯ŸåŠããŸããïŒããšãã質åãžã®åçãæ€çŽ¢äžã«èŠã€ãããŸããïŒåçã«ã€ããŠã¯ãäžèšã®èšäºãåç §ããŠãã ããïŒã illumos-gateãããžã§ã¯ãã®ã³ãŒãã
static int devzvol_readdir(....) { .... char *ptr; .... ptr = strchr(ptr + 1, '/') + 1; rw_exit(&sdvp->sdev_contents); sdev_iter_datasets(dvp, ZFS_IOC_DATASET_LIST_NEXT, ptr); .... }
PVS-Studio èŠå ïŒ V769 ãstrchrïŒptr + 1ãã/ãïŒ+ 1ãåŒã®ãstrchrïŒptr + 1ãã/ãïŒããã€ã³ã¿ãŒã¯nullptrã§ããå¯èœæ§ããããŸãã ãã®ãããªå Žåãçµæã®å€ã¯ç¡æå³ã«ãªãã䜿çšããªãã§ãã ããã
strchré¢æ°ã¯ãæåã®åŒæ°ã§æå®ãããæååå ã®2çªç®ã®åŒæ°ã§æå®ãããæåã®æåã®åºçŸãæããã€ã³ã¿ãŒãè¿ããŸãã ãã®ãããªæåãèŠã€ãããªãå Žåã strchrã¯NULLãè¿ããŸã ã ãã ãããã®äºå®ã¯èæ ®ããããå€ã1ããåžžã«æ»ãå€ã«è¿œå ãããŸãã ãã®çµæã ptrãã€ã³ã¿ãŒã¯åžžã«ãŒã以å€ã«ãªããŸããã€ãŸãã ptrïŒ= NULLãšãã圢åŒãããã«ãã§ãã¯ããŠãããã€ã³ã¿ãŒã®æå¹æ§ã«é¢ããæ å ±ã¯åŸãããŸããã ãã®çµæãç¹å®ã®æ¡ä»¶äžã§ããã®ã³ãŒãã«ããã«ãŒãã«ãããã¯ãçºçããŸããã
èå¥åCVE-2014-9491ã¯ãã®ãšã©ãŒã«å²ãåœãŠãããŸããïŒillumosã®devzvol_readdiré¢æ°ã¯strchråŒã³åºãã®æ»ãå€ããã§ãã¯ããŸãããããã«ããããªã¢ãŒãã®æ»æè ãäžç¹å®ã®ãã¯ãã«ãä»ããŠãµãŒãã¹æåŠïŒ NULLãã€ã³ã¿ãŒã®åç §è§£é€ãšãããã¯ïŒãåŒãèµ·ããããšãã§ããŸã ã
CVEèªäœã¯2014幎ã«çºèŠããããšããäºå®ã«ãããããããç§ãã¡èªèº«ã®ç 究ã®éçšã§ã2017幎ã«ãã®ãšã©ãŒãçºèŠããããããã®ãããã«ãªããŸããã
2äœ
åºå žïŒ Unreal Engineéçºããã»ã¹ã®äžéšãšããŠã®éçåæã
2çªç®ã«ãããšã©ãŒãçºèŠãããŸãã...ã¯ããåã³Unreal Engineã§çºèŠãããŸããã ãšãŠãé¢çœãã£ãã®ã§ãæµæã§ãããæžããŸããã§ããã
ã泚æ å®éãã¢ã³ãªã¢ã«ãšã³ãžã³ã«é¢ããäžèšã®èšäºããããã«2ã3ã®ãšã©ãŒãèšè¿°ããŸãããããã§ãåããããžã§ã¯ãã«ããŸãé »ç¹ã«ã¢ã¯ã»ã¹ããããããŸããã ãããã£ãŠãäžèšã®èšäºãç¹ã«èŠåV714ããã³V709ãèªåã§ç¢ºèªããããšã匷ããå§ãããŸãã
ãã®åŸãå€ãã®ã³ãŒãããããŸãããåé¡ã®æ¬è³ªãç解ããå¿ èŠããããŸãã
bool FCreateBPTemplateProjectAutomationTests::RunTest( const FString& Parameters) { TSharedPtr<SNewProjectWizard> NewProjectWizard; NewProjectWizard = SNew(SNewProjectWizard); TMap<FName, TArray<TSharedPtr<FTemplateItem>> >& Templates = NewProjectWizard->FindTemplateProjects(); int32 OutMatchedProjectsDesk = 0; int32 OutCreatedProjectsDesk = 0; GameProjectAutomationUtils::CreateProjectSet(Templates, EHardwareClass::Desktop, EGraphicsPreset::Maximum, EContentSourceCategory::BlueprintFeature, false, OutMatchedProjectsDesk, OutCreatedProjectsDesk); int32 OutMatchedProjectsMob = 0; int32 OutCreatedProjectsMob = 0; GameProjectAutomationUtils::CreateProjectSet(Templates, EHardwareClass::Mobile, EGraphicsPreset::Maximum, EContentSourceCategory::BlueprintFeature, false, OutMatchedProjectsMob, OutCreatedProjectsMob); return ( OutMatchedProjectsDesk == OutCreatedProjectsDesk ) && ( OutMatchedProjectsMob == OutCreatedProjectsMob ); }
åé¡ãç解ããããã«å¿ èŠãªæ¬¡ã®éèŠãªç¹ã«æ³šæããŠãã ããã å€æ°OutMatchedProjectsDesk ã OutCreatedProjectsDesk ãããã³OutMatchedProjectsMob ã OutCreatedProjectsMobã¯ã宣èšæã«ãŒãã§åæåããã CreateProjectSetã¡ãœããã«åŒæ°ãšããŠæž¡ãããŸãã
ãã®åŸãã¹ããŒãã¡ã³ãã¹ããŒãã¡ã³ãreturnã§å€æ°ãæ¯èŒãããŸãã ãããã£ãŠã CreateProjectSetã¡ãœããã¯æåŸã®2ã€ã®åŒæ°ãåæåããå¿ èŠããããŸãã
ããã§ã¯ããšã©ãŒãå«ãCreateProjectSetã¡ãœãããèŠãŠã¿ãŸãããã
static void CreateProjectSet(.... int32 OutCreatedProjects, int32 OutMatchedProjects) { .... OutCreatedProjects = 0; OutMatchedProjects = 0; .... OutMatchedProjects++; .... OutCreatedProjects++; .... }
PVS-Studioã®èŠå ïŒ
- V763ãã©ã¡ãŒã¿ãŒ 'OutCreatedProjects'ã¯ã䜿çšãããåã«åžžã«é¢æ°æ¬äœã§æžãæããããŸãã gameprojectautomationtests.cpp 88
- V763ãã©ã¡ãŒã¿ãŒ 'OutMatchedProjects'ã¯ã䜿çšãããåã«åžžã«é¢æ°æ¬äœã§æžãæããããŸãã gameprojectautomationtests.cpp 89
ãã©ã¡ãŒã¿ãŒOutCreatedProjectsããã³OutMatchedProjectsã¯åç §ãäœæããã®ãå¿ãããã®çµæã察å¿ããåŒæ°ã®å€ãåçŽã«ã³ããŒãããŸãã çµæãšããŠãäžèšã®RunTestã¡ãœããã®æ»ãå€ã¯åžžã«trueã§ã ãããã¯ãæ¯èŒããããã¹ãŠã®å€æ°ãåæåäžã«æå®ãããåãå€-0ãæã£ãŠããããã§ãã
æ£ããã³ãŒãã¯æ¬¡ã®ãšããã§ãã
static void CreateProjectSet(.... int32 &OutCreatedProjects, int32 &OutMatchedProjects)
äžäœ
ãœãŒã¹ïŒ éçã³ãŒãåæã倧奜ãïŒ
ãã®ééããèŠãé端ã誰ããããããªãŒããã¹ããã«ã€ããŠçãäœå°ã¯ãããŸããã§ããã äžè¬çã«ãèªåã§èŠãŠãã ããã äžèšã®ã³ãŒãã¹ããããã§ãšã©ãŒãèŠã€ãããŸã§ãåé¡ã®èª¬æã«æ±ºããŠã¢ã¯ã»ã¹ããªãã§ãã ããã ãšããã§ããããžã§ã¯ã-StarEngine-ã¯åã³ã²ãŒã ãšã³ãžã³ã§ãã
PUGI__FN bool set_value_convert( char_t*& dest, uintptr_t& header, uintptr_t header_mask, int value) { char buf[128]; sprintf(buf, "%d", value); return set_value_buffer(dest, header, header_mask, buf); }
ããŠãééããèŠã€ããæåã¯ã©ãã§ããïŒ :)
PVS-StudioèŠå ïŒ V614æªåæåãããã¡ãŒ 'buf'ã䜿çšãããŸããã 'printf'é¢æ°ã®æåã®å®åŒæ°ã確èªããããšãæ€èšããŠãã ããã pugixml.cpp 3362
確ãã«è³ªåããããŸãïŒã printf ïŒã³ãŒãã§sprintfé¢æ°ã®åŒã³åºãã®ã¿ãããå Žåã printfã¢ãã©ã€ã¶ãŒã®èŠåã¯ã©ãããæ¥ãŸããïŒã
ãããæ¬è³ªã§ãïŒ sprintfã¯ïŒïŒïŒ std :: printfã«å±éããããã¯ãã§ãïŒ
#define sprintf std::printf
ãã®çµæãåæåãããŠããªãbufãããã¡ãŒããã©ãŒãããæååãšããŠäœ¿çšãããŸãã ãããã§ããã ãã®ééãã¯ãåœç¶ã®ããšãªããã1äœã«ãªã£ããšæããŸãã
ãã¯ã宣èšã䜿çšããŠããããŒãã¡ã€ã«ã«ãªã³ã¯ããŸã ã
ãããã«
åéããããã°ãã楜ãã¿ãã ããã å人çã«ã¯ã圌ãã¯ç§ã«ãšã£ãŠååã«èå³æ·±ãããã§ããã ãããããã¡ãããããªãã®ããžã§ã³ã¯ç§ã®ããžã§ã³ãšã¯ç°ãªãå¯èœæ§ããããŸãããã®ããã ããã°ã®èšäºãèªããããªãŒãã³ãœãŒã¹ãããžã§ã¯ãã§PVS-Studioãæ€åºãããšã©ãŒã®ãªã¹ããèŠãŠããããã10ããç·šéã§ããŸãã

ãŸããèšäºã«èšèŒãããŠãããã¹ãŠã®ãšã©ãŒïŒ ããã³ä»ã®å€ãã®ãšã©ãŒïŒã¯PVS-Studioã¢ãã©ã€ã¶ãŒã䜿çšããŠæ€åºãããããšãæãåºããŠãã ããããããžã§ã¯ãã§è©ŠããŠã¿ãããšããå§ãããŸãïŒ ããŠã³ããŒãããŒãžãžã®ãªã³ã¯ ã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒã»ã«ã²ã€ãŽã¡ã·ãªãšãã 2017幎ã®C ++ãããžã§ã¯ãã®ãã°ã®ããã10
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãåéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã