ã»ãŒ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 ++ã®èгç¹ããèŠãããã°ã©ã ã®åäœã«ã¯åœ±é¿ããŸããã ãã®çµæãã¯ãªã¢ãããã¹ãããŒã¿ãã¡ã¢ãªã«æ®ãå ŽåããããŸãã
ãã®ãããã¯ãããã«æ·±ãæãäžããã«ã¯ã次ã®èšäºãèªãããšããå§ãããŸãã
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