![](https://habrastorage.org/getpro/habr/post_images/d99/28e/f3d/d9928ef3d7038b3b6d126b6952ad4502.png)
ä»æ¥ã®èšäºã¯å°ãå€ãã£ãŠããŸãã å°ãªããšã1ã€ã®ãããžã§ã¯ããåæããã®ã§ã¯ãªããäžåºŠã«3ã€ã®ãããžã§ã¯ãã§ãšã©ãŒãæ¢ããæãèå³æ·±ããã°ãããå Žæã確èªãããšããçç±ã§ã ãããŠæãèå³æ·±ãã®ã¯ã誰ãè¥ããŠæé«å質ã®ã³ãŒããæžããŠããããç¥ãããšã§ãã ãã®ãããè°é¡ã«ã¯ãFirebirdãMySQLãããã³PostgreSQLãããžã§ã¯ãã®ã³ãŒãã®ãšã©ãŒã®åæããããŸãã
ãããžã§ã¯ãã«ã€ããŠç°¡åã«
ç«ã®é³¥
FirebirdïŒFirebirdSQLïŒã¯ãMac OS XãLinuxãMicrosoft Windowsãããã³ããŸããŸãªUnixãã©ãããã©ãŒã ã§å®è¡ãããã¯ãã¹ãã©ãããã©ãŒã ããŒã¿ããŒã¹ç®¡çã·ã¹ãã ïŒDBMSïŒã§ãã
Firebirdã¯2001幎以æ¥ãããŸããŸãªç£æ¥ã·ã¹ãã ïŒå庫ããã³ããžãã¹ãéèãå ¬å ±éšéïŒã§äœ¿çšãããŠããŸããCããã³C ++ããã°ã©ããŒãæè¡é¡§åã®åæ¥çã«ç¬ç«ãããããžã§ã¯ãã§ãã
è¿œå æ å ±ïŒ
- å ¬åŒãµã€ã ;
- GitHubãªããžããª
- GitHubã®æã®æ°-133;
- GitHubã®ãã©ãŒã¯ã®æ°ã¯51ã§ãã
MySQL
MySQLã¯ç¡æã®ãªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ç®¡çã·ã¹ãã ã§ãã éåžžãMySQLã¯ããŒã«ã«ãŸãã¯ãªã¢ãŒãã¯ã©ã€ã¢ã³ãããã¢ã¯ã»ã¹ããããµãŒããŒãšããŠäœ¿çšãããŸããããã£ã¹ããªãã¥ãŒã·ã§ã³ã«ã¯ãMySQLãã¹ã¿ã³ãã¢ãã³ãââãã°ã©ã ã«å«ããããšãã§ããå éšãµãŒããŒã©ã€ãã©ãªãå«ãŸããŠããŸãã
MySQL DBMSã®æè»æ§ã¯ãå€æ°ã®ããŒãã«ã¿ã€ãããµããŒãããããšã«ããæäŸãããŸãããŠãŒã¶ãŒã¯ããã«ããã¹ãæ€çŽ¢ããµããŒãããMyISAMããŒãã«ãšãåã ã®ã¬ã³ãŒãã¬ãã«ã§ãã©ã³ã¶ã¯ã·ã§ã³ããµããŒãããInnoDBããŒãã«ã®äž¡æ¹ãéžæã§ããŸãã ããã«ãMySQL DBMSã«ã¯ç¹å¥ãªã¿ã€ãã®ããŒãã«äŸãä»å±ããŠãããæ°ããã¿ã€ãã®ããŒãã«ãäœæããåçã瀺ããŠããŸãã ãªãŒãã³ã¢ãŒããã¯ãã£ãšGPLã©ã€ã»ã³ã¹ã®ãããã§ãæ°ããã¿ã€ãã®ããŒãã«ãåžžã«MySQL DBMSã«ç»å ŽããŠããŸãã
è¿œå æ å ± ïŒ
- å ¬åŒãµã€ã ;
- GitHubãªããžããª
- GitHubã®æã®æ°-2179;
- GitHubã®ãã©ãŒã¯ã®æ°ã¯907ã§ãã
PostgreSQL
PostgreSQLã¯ç¡æã®ãªããžã§ã¯ããªã¬ãŒã·ã§ãã«ããŒã¿ããŒã¹ç®¡çã·ã¹ãã ïŒDBMSïŒã§ãã
AIXãããŸããŸãªBSDã·ã¹ãã ãHP-UXãIRIXãLinuxãmacOSãSolaris / OpenSolarisãTru64ãQNXãMicrosoft Windowsãªã©ãå€ãã®UNIXã©ã€ã¯ãªãã©ãããã©ãŒã ã®å®è£ ããããŸãã å°èŠæš¡ãªå人çšã¢ããªã±ãŒã·ã§ã³ããå€æ°ã®åæãŠãŒã¶ãŒãå«ã倧èŠæš¡ãªã€ã³ã¿ãŒãããã¢ããªã±ãŒã·ã§ã³ïŒããŒã¿ãŠã§ã¢ããŠã¹ïŒãŸã§ãããŸããŸãªéã®ããŒã¿ã«å¯Ÿå¿ã§ããŸãã
PostgreSQLã¯ãã«ãªãã©ã«ãã¢å€§åŠããŒã¯ã¬ãŒæ ¡ã§ãªãŒãã³ãœãŒã¹ãããžã§ã¯ããšããŠéçºãããéå¶å©ã®Postgres DBMSã«åºã¥ããŠããŸãã
è¿œå æ å ± ïŒ
- å ¬åŒãµã€ã ;
- GitHubäžã®ãªããžããªã®ããã©ãŒã ã
- GitHubã®æã®æ°-3260;
- GitHubã®ãã©ãŒã¯ã®æ°ã¯1107ã§ãã
PVS-Studio
ãšã©ãŒãèŠã€ããæ段ãšããŠã PVS-Studioéçã³ãŒãã¢ãã©ã€ã¶ãŒã䜿çšãããŸããã PVS-Studioã¯ãCãC ++ãCïŒããã°ã©ãã³ã°èšèªçšã®ãœãŒã¹ã³ãŒãã¢ãã©ã€ã¶ãŒã§ãããããã°ã©ã ã³ãŒãã®ãšã©ãŒãæ¬ é¥ãæœåšçãªè匱æ§ãæ©æã«æ€åºããããšã«ããããœãããŠã§ã¢éçºã³ã¹ããåæžããŸãã Windowsããã³Linuxç°å¢ã§åäœããŸãã
ããŠã³ããŒããªã³ã¯ïŒ
3ã€ã®ãããžã§ã¯ãã¯ãã¹ãŠã¢ã»ã³ãã«ããã.slnãã¡ã€ã«ãå«ãŸããŠããïŒããã«ããŸãã¯CMakeãä»ããŠçæãããïŒãããåæã®ã¿ã¹ã¯èªäœã¯å®å šã«ç°¡åã«ãªããŸã-Visual Studio IDEã«çµã¿èŸŒãŸããPVS-Studioãã©ã°ã€ã³ã€ã³ã¿ãŒãã§ã€ã¹ãä»ããŠãã¹ããå®è¡ããã ãã§ãã
æ¯èŒåºæº
ãããžã§ã¯ãã§èå³æ·±ããšæããããã®ãèŠãåã«ãèšäºã®äž»ãªè³ªåã®1ã€ãã€ãŸãæ¯èŒãå®è¡ããåºæºã«ãã£ãŠæ±ºå®ããå¿ èŠããããŸãã
çŽæ¥æ¯èŒãè¯ãèãã§ã¯ãªãã®ã¯ãªãã§ããïŒ
ã¢ãã©ã€ã¶ãŒã«ãã£ãŠçºè¡ãããèŠåã®æ°ïŒãŸãã¯ãã³ãŒãã®è¡æ°ã«å¯ŸããèŠåã®æ°ã®æ¯çïŒãçæ£é¢ããæ¯èŒããããšã¯ãæãåŽåã®ããããªãæ¹æ³ã§ãããè¯ãèãã§ã¯ãããŸããã ãªãã§ïŒ PostgreSQLãããžã§ã¯ããäŸã«åããŸããããã§ã¯ãä¿¡é Œæ§ã®é«ãGAèŠåã®æ°ã¯611ã§ããPVS -StudioãŠã£ã³ããŠã§èšºæã«ãŒã«ã³ãŒãïŒ V547 ïŒãšã¡ãã»ãŒãžã®äžéšïŒ ret <0 ïŒã«ãããã£ã«ã¿ãªã³ã°ãèšå®ãããšã419åã®èŠåã衚瀺ãããŸãïŒ å€ããã...ããã¯ããã¯ããã³ãŒããèªåçã«çæããããªã©ããããã®èŠåã®åå ãããããšãããã«ç€ºåããŠããŸãã ãããã®èŠåãå«ããã¡ã€ã«ã®åé ã®ã³ã¡ã³ãã¯ãçè«ãè£ä»ããŠããŸãã
/* This file was generated automatically by the Snowball to ANSI C compiler */
ã³ãŒããèªåçã«çæãããããšãç¥ã£ãä»ã2ã€ã®æ¹æ³ããããŸãã
- èªåçæãããã³ãŒãã¯éèŠã§ã¯ãªãããããã¹ãŠã®èŠåãæå¶ããŸãã ãããã£ãŠãèŠåïŒGAãLvl1ïŒã®æ°ã¯ããã«69ïŒ æžå°ããŸãïŒ
- èªåçæãããã³ãŒãã®ãšã©ãŒããŸã ãšã©ãŒã§ããããšãåãå ¥ããããã«ã€ããŠäœããè©Šã¿ãŸãïŒããšãã°ãã³ãŒãçæã¹ã¯ãªãããä¿®æ£ããŸãïŒã ãã®å ŽåãèŠåã®æ°ã¯åŒãç¶ãéèŠã§ãã
å¥ã®èœãšãç©Žã¯ããããžã§ã¯ãã§äœ¿çšããããµãŒãããŒãã£ã³ã³ããŒãã³ãã®ãšã©ãŒã§ãã åã³ïŒ
- ãã®ãããªééãã¯ããªãã®é çã§ã¯ãªããšèšããŸãã ãŠãŒã¶ãŒã¯ãã®å£°æã«åæããŸããïŒ
- 責任ãåããŸãã
ãããã¯ãéžæã®åé¡ãåŒãèµ·ããå¯èœæ§ã®ããã»ãã®2ã3ã®äŸã§ããããã®è§£æ±ºçã¯é¢é£ããèŠåã®æ°ãïŒå Žåã«ãã£ãŠã¯å€§å¹ ã«ïŒå€æŽã§ããŸãã
å¥ã®æ¹æ³
第3ã¬ãã«ã®ä¿¡é Œæ§ïŒäœã確å®æ§ïŒã®èŠåã¯èæ ®ãããªãããšã«ããã«åæããŸãã ãããã¯ãæåã«æ³šæããå¿ èŠããããã®ã§ã¯ãããŸããã ééããªãæçšãªãã®ããããããããŸããããèšäºãæžããšããéçåæã䜿çšãããšãã¯ãã¬ãã«3ã®èŠåãç¡èŠããã®ãçã«ããªã£ãŠããŸãã
ãã®äœæ¥ã¯å€ãã®çç±ã§éåžžã«åŽåéçŽçã§ãããããæ¬æ Œçãªæ¯èŒã¯è¡ããŸããã ãããžã§ã¯ãããšã«å°ãªããšãäºåã®ã¢ãã©ã€ã¶ãŒèšå®ãååŸããæ°çŸã®èŠåã衚瀺ããã³åæããŸããããã«ã¯éåžžã«é·ãæéãããããŸãããå¹çã¯ã©ããªãã§ãããããããã¯æªè§£æ±ºã®åé¡ã§ãã
ãããã£ãŠãç§ãã¡ã¯å¥ã®æ¹æ³ã§è¡åããŸãã 3ã€ã®ãããžã§ã¯ããã¹ãŠã®ãã°ã調ã¹ãæãèå³æ·±ããšã©ãŒã®ããã€ããèŠã€ããŠè§£æããä»ã®ãããžã§ã¯ãã«ãã®ãããªäœãããããã©ãããåæã«èª¿ã¹ãŸãã
ããã«ãæ¯èŒçæè¿ãã»ãã¥ãªãã£åé¡ã®æ€çŽ¢ã®æ¹åã«ç®ãåãå§ããŸããã èšäºã§ãããã®ãããã¯ã«é¢ãããã®ã§ãã-ã PVS-Studioãè匱æ§ãèŠã€ããã®ã«ã©ã®ããã«åœ¹ç«ã€ã ãã ãã®ã¬ãã¥ãŒã®åå è ã®1人ã§ããMySQLãäžèšã®èšäºã«åå ããããšãèãããšãåæ§ã®åããæ€åºã§ãããã©ããã確èªããããšã«èå³ããããŸããã ããªãã¯ã¯ãããŸãã-è匱æ§ã«é¢ããèšäºã®èŠåãšåæ§ã«ãPVS-Studioã®èŠåãè¿œå ã§ç¢ºèªããŠãã ããã
äžèšãèŠçŽããŠã次ã®åºæºã«åŸã£ãŠã³ãŒãã®å質ãè©äŸ¡ããŸãã
- åè¿°ã®è匱æ§ã«é¢ããèšäºããã¢ãã©ã€ã¶ãŒã®èŠåçªå·ãååŸãã3ã€ã®ãããžã§ã¯ããã¹ãŠã§åæ§ã®èŠåãæ¢ããŸãã ãã®ã¢ãããŒãã¯ç解ã§ãããšæããŸã-ãã®ãããªã³ãŒãã¯ïŒåžžã«ã§ã¯ãããŸãããïŒè匱æ§ã§ããå¯èœæ§ãããããšãç¥ãããŠãããããç¹å¥ãªæ³šæãæã䟡å€ããããŸãã
- æåã®2ã€ã®ä¿¡é Œã¬ãã«ã®ã¢ãã©ã€ã¶ãŒã®GAèŠåãèŠãŠãæãèå³æ·±ããšæããããã®ãéžæããä»ã®ãããžã§ã¯ãã§ãã®ãããªãã®ããããã©ããã確èªããŸãã
ãããã®ãã§ãã¯ã®çµæã«åºã¥ããŠããããžã§ã¯ãã®è²¯éç®±ã«ããã«ãã£ãã€ã³ããèšé²ããŸãã ãããã£ãŠãããå°ãªããã€ã³ããç²åŸãã人ã¯ãäžèšã®ã¢ãããŒãã«é¢é£ããŠæé«ã®ã³ãŒããæã£ãŠããŸãã ãã¡ããã埮åŠãªéãã¯ãããŸãããåæãšããŠããŸãèŠçŽãããšãã«èª¬æããŸãã
ããã§ã¯ãå§ããŸãããïŒ
解æãšã©ãŒ
äžè¬çãªåæçµæ
以äžã®è¡šã¯ããçŸç¶ã®ãŸãŸãã§è¡ããããããžã§ã¯ãã®åæã®äžè¬çãªçµæã瀺ããŠããŸã-誀ã£ãèŠåããã£ã¬ã¯ããªã«ãããã£ã«ã¿ãªã³ã°ãªã©ãæå¶ããŸããã ãããã¯äžè¬çãªèŠåã«ãããªãããšã«æ³šæããŠãã ããã
ãããžã§ã¯ã
| é«ã確å®æ§
| äžçšåºŠã®ç¢ºå®æ§
| äœã確ã
| åèš
|
ç«ã®é³¥
| 156
| 680
| 1045
| 1881
|
MySQL
| 902
| 1448
| 2925
| 5275
|
PostgreSQL
| 611
| 1432
| 1576
| 3619
|
ãã ãããã®è¡šã®ã³ãŒãã®å質ãå€æããªãã§ãã ããã äžèšã®çç±ãè¿°ã¹ãŸããããç¹°ãè¿ããŸãïŒ
- ã¢ãã©ã€ã¶ãŒã®äºåã»ããã¢ããã®æ¬ åŠ;
- 誀æ€ç¥ã¯æå¶ãããŸããã
- ã³ãŒãããŒã¹ã®ç°ãªããµã€ãºã
- èšäºã®å·çäžã«ã¢ãã©ã€ã¶ãŒã«ä¿®æ£ãå ãããããããå·çã®éå§æãšçµäºæã«ãã®è¡šã®çµæãç°ãªãå ŽåããããŸãã
èŠåã®å¯åºŠïŒãšã©ãŒã§ã¯ãããŸããïŒïŒã«é¢ããŠã¯ãã¢ãã©ã€ã¶ãŒã®äºåèšå®ãªãã§ååŸãããŸããã€ãŸããLOCã«å¯ŸããèŠåã®æ°ã®æ¯çã§ããFirebirdãšPostgreSQLã§ã¯ã»ãŒçãããMySQLã§ã¯ãããã«é«ããªããŸãã ããããããªããç¥ã£ãŠããããã«ãæªéã¯çŽ°éšã«ããã®ã§ãç§ãã¡ã¯æ¥ãã§çµè«ãäžããŸããã
å人ããŒã¿ã®äžæžãã®åé¡
èŠåV597ã¯ãæé©åäžã«ã³ã³ãã€ã©ãŒã«ãã£ãŠåé€ã§ããããŒã¿ã¯ãªãŒãã³ã°ãå®è¡ããmemseté¢æ°ã®åŒã³åºãã®ååšãéç¥ããŸãã ãã®ãããå人ããŒã¿ã¯ã¯ãªãŒã³ã¢ãããããªããŸãŸã«ãªãå ŽåããããŸãã åé¡ã®è©³çŽ°ã«ã€ããŠã¯ã蚺æã«ãŒã«ã®ããã¥ã¡ã³ããåç §ããŠãã ãã ã
FirebirdãPostgreSQLããã®ãããªèŠåã衚瀺ããŸããã§ããããMySQLã«ã€ããŠã¯èšããŸããã ãã®ãããžã§ã¯ãã®çãããã³ãŒããèŠãŠã¿ãŸãããã
extern "C" char * my_crypt_genhash(char *ctbuffer, size_t ctbufflen, const char *plaintext, size_t plaintext_len, const char *switchsalt, const char **params) { int salt_len; size_t i; char *salt; unsigned char A[DIGEST_LEN]; unsigned char B[DIGEST_LEN]; unsigned char DP[DIGEST_LEN]; unsigned char DS[DIGEST_LEN]; .... (void) memset(A, 0, sizeof (A)); (void) memset(B, 0, sizeof (B)); (void) memset(DP, 0, sizeof (DP)); (void) memset(DS, 0, sizeof (DS)); return (ctbuffer); }
PVS-Studioã®èŠå ïŒ
- V597ã³ã³ãã€ã©ãŒã¯ããAããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_genhash_impl.cc 420
- V597ã³ã³ãã€ã©ãŒã¯ããBããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_genhash_impl.cc 421
- V597ã³ã³ãã€ã©ãŒã¯ããDPããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_genhash_impl.cc 422
- V597ã³ã³ãã€ã©ãŒã¯ããDSããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã crypt_genhash_impl.cc 423
ã¢ãã©ã€ã¶ãŒã¯ã1ã€ã®é¢æ°ïŒïŒïŒã§4ã€ã®ãããã¡ãŒãå³åº§ã«æ€åºããŸãããã©ã®ããŒã¿ã«å¯ŸããŠåŒ·å¶çãªããŒã¿ã¯ãªãŒãã³ã°ãå®è¡ããå¿ èŠããããåæã«çºçããªãå¯èœæ§ããããŸãã ç¡å¹åãããïŒçè«äžïŒããŒã¿ã¯ãããã®ãŸãŸãã®åœ¢ã§ã¡ã¢ãªã«æ®ããŸãã ãããã¡A ã B ã DP ã DSã®ãããªã䜿çšããªããããã³ã³ãã€ã©ã¯memseté¢æ°åŒã³åºããåé€ã§ããŸãããã®ãããªå€æŽã¯ãC / C ++ã®èŠ³ç¹ããããã°ã©ã ã®åäœã«åœ±é¿ãäžããªãããã§ãã ãã®åé¡ã®è©³çŽ°ã«ã€ããŠã¯ãã ãã©ã€ããŒãããŒã¿ã®å®å šãªã¯ãªãŒãã³ã° ããåç §ããŠãã ããã
ä»ã®èŠåãåæ§ãªã®ã§ãå解ããŸããã ãããããªã¹ãããŸãã
- V597ã³ã³ãã€ã©ãŒã¯ããtable_listããªããžã§ã¯ãã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã sql_show.cc 630
- V597ã³ã³ãã€ã©ãŒã¯ããWããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã sha.cpp 413
- V597ã³ã³ãã€ã©ãŒã¯ããWããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã sha.cpp 490
- V597ã³ã³ãã€ã©ãŒã¯ããTããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã sha.cpp 491
- V597ã³ã³ãã€ã©ãŒã¯ããWããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã sha.cpp 597
- V597ã³ã³ãã€ã©ãŒã¯ããTããããã¡ãŒã®ãã©ãã·ã¥ã«äœ¿çšããããmemsetãé¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã sha.cpp 598
ãããŠãããå°ãèå³æ·±ãã±ãŒã¹ããããŸãã
void win32_dealloc(struct event_base *_base, void *arg) { struct win32op *win32op = arg; .... memset(win32op, 0, sizeof(win32op)); free(win32op); }
PVS-StudioèŠå ïŒ V597ã³ã³ãã€ã©ã¯ã 'win32op'ãªããžã§ã¯ãã®ãã©ãã·ã¥ã«äœ¿çšããã 'memset'é¢æ°åŒã³åºããåé€ã§ããŸããã RtlSecureZeroMemoryïŒïŒé¢æ°ã䜿çšããŠããã©ã€ããŒãããŒã¿ãæ¶å»ããå¿ èŠããããŸãã win32.c 442
ããã§ãç¶æ³ã¯äŒŒãŠããŸãããã¡ã¢ãªå ã®ããŒã¿ããŒãã«ããåŸã察å¿ãããã€ã³ã¿ãŒãfreeé¢æ°ã«æž¡ãããŸãã ããã«ãããããããã³ã³ãã€ã©ãŒã¯memsetåŒã³åºããåé€ããŠãé¢æ°ã®åŒã³åºãã ããæ®ãããšãã§ããŸãã ãã®çµæããŒãã«ãªã»ããããå¿ èŠãããããŒã¿ãã¡ã¢ãªã«æ®ãå ŽåããããŸãã 詳现ã«ã€ããŠã¯ãäžèšã®èšäºãã芧ãã ããã
åŸç¹ ããªãé倧ãªééãã§ãã1ã€ã®ã³ããŒã«ã¯èŠãããªããã®ããããŸãã 3 MySQLããã«ãã£ãã€ã³ãã
mallocããã³åæ§ã®é¢æ°ã«ãã£ãŠè¿ããããã€ã³ã¿ãŒã®æ€èšŒã®æ¬ åŠ
V769èŠåã¯ã3ã€ã®ãããžã§ã¯ããã¹ãŠã«å¯ŸããŠçºè¡ãããŸããã
- FirebirdïŒé«ã確å®æ§-0; äžçšåºŠã®ç¢ºå®æ§-0; äœã確å®æ§-9;
- MySQLïŒç¢ºå®æ§ãé«ã-0; äžçšåºŠã®ç¢ºå®æ§-13; äœã確å®æ§-103;
- PostgreSQLïŒé«ç¢ºå®æ§-1äžç¢ºå®æ§-2; äœã確å®æ§-24ã
3çªç®ã®ã¬ãã«ãèæ ®ããªãããšã«åæãããããFirebirdã¯ããã«ïŒè¯ãæå³ã§ïŒæ¯èŒããé€å€ãããŸãã PostgreSQLã³ãŒãã«é¢ãã3ã€ã®èŠåããã¹ãŠç¡é¢ä¿ã§ããããšãå€æããŸããã ããããMySQLã§ã¯ããã¹ãŠãããã»ã©æ確ã§ã¯ãããŸããã 誀æ€ç¥ããããŸããããããã€ãã®èŠåã¯éåžžã«èå³æ·±ããã®ã§ãã
bool Gcs_message_stage_lz4::apply(Gcs_packet &packet) { .... unsigned char *new_buffer = (unsigned char*) malloc(new_capacity); unsigned char *new_payload_ptr = new_buffer + fixed_header_len + hd_len; // compress payload compressed_len= LZ4_compress_default((const char*)packet.get_payload(), (char*)new_payload_ptr, static_cast<int>(old_payload_len), compress_bound); .... }
PVS-Studio èŠå ïŒ V769 ãnew_buffer + fixed_header_lenãåŒã®ãnew_bufferããã€ã³ã¿ãŒã¯nullptrã§ããå¯èœæ§ããããŸãã ãã®ãããªå Žåãçµæã®å€ã¯ç¡æå³ã«ãªãã䜿çšããªãã§ãã ããã è¡ããã§ãã¯ïŒ74ã73ãgcs_message_stage_lz4.cc 74
mallocé¢æ°ã¯ãèŠæ±ãããã¡ã¢ãªãããã¯ãè¿ãããšãã§ããªãã£ãå Žåã new_bufferå€æ°ã«æžã蟌ãããšãã§ããnullãã€ã³ã¿ãè¿ããŸãã ããã«ã new_payload_ptrå€æ°ã®å€ãåæåãããšãã new_bufferãã€ã³ã¿ãŒã®å€ãfixed_header_lenããã³hd_lenå€æ°ã®å€ã«è¿œå ãããŸã ã ããã ãã§ãããã€ã³ã¿ãŒnew_payload_ptrãè¿ãããªããã€ã³ãïŒããã«ã©ããã§ïŒããšãã°ãå¥ã®é¢æ°ã§ïŒ NULLãšæ¯èŒããŠãã€ã³ã¿ãŒã®æå¹æ§ããã§ãã¯ãããå Žåããã®ãããªãã§ãã¯ã¯åœ¹ã«ç«ã¡ãŸããã çµæãèªåã§å€æã§ããŸãã ãããã£ãŠã new_payload_ptrãåæåããåã«ã new_bufferãNULLãã€ã³ã¿ãŒã§ã¯ãªãããšã確èªããå¿ èŠããããŸãã
誰ããå察ããå¯èœæ§ããããŸã-å¿ èŠãªã¡ã¢ãªãããã¯ãååŸã§ããªãã£ãå Žåãè¿ãããmallocå€ã®NULLããã§ãã¯ããçç± ãšã«ããããã以äžã®éåžžã®æäœã¯äžå¯èœã§ãããããã£ãŠãããšãã°ããã®ãã€ã³ã¿ãŒã䜿çšããŠããã«äœæ¥ãè¡ããšãã¢ããªã±ãŒã·ã§ã³ãã¯ã©ãã·ã¥ããŸãã
äžéšã®éçºè ã¯ãã®ç«å Žã«åºå·ããŠãããããååšããæš©å©ããããŸããããã®ã¢ãããŒãã¯ã©ã®çšåºŠæ£ããã®ã§ããããïŒ çµå±ãåæ§ã®ç¶æ³ãäœããã®æ¹æ³ã§åŠçããŠãããšãã°ãããŒã¿ã倱ã£ããããããç©ããã«ãèœã¡ããããªãããã«ããããšãã§ããŸãã ããã«ããã®ãããªã³ãŒãã¯æœåšçã«è匱ã«ãªããŸãã nullãã€ã³ã¿ãŒã§ã¯äœæ¥ãçŽæ¥è¡ããããå¥ã®ã¡ã¢ãªãããã¯ïŒ nullãã€ã³ã¿ãŒ+ value ïŒã§äœæ¥ãçºçããå Žåãã¢ããªã±ãŒã·ã§ã³ã¯äžéšã®ããŒã¿ãæå·ããå¯èœæ§ããããŸãã ããã«ãããã¯ãã¹ãŠãã¢ããªã±ãŒã·ã§ã³ã«è匱æ§ãè¿œå ããå¥ã®æ¹æ³ã§ãã å¿ èŠã§ããïŒ é·æãçæãæçµæ±ºå®ã¯ã誰ããèªåã§è¡ããšæããŸãã
2çªç®ã®ã¢ãããŒãã«åŸãããšããå§ãããŸãã蚺æã«ãŒã«V769ã¯ããã®ãããªç¶æ³ã®æ€åºã«åœ¹ç«ã¡ãŸãã
ãã®ãããªé¢æ°ãNULLã決ããŠè¿ãããšãã§ããªããšå€æããå Žåãé©åãªèŠåãåãåããªãããã«ãããã«ã€ããŠã¢ãã©ã€ã¶ãŒã«éç¥ã§ããŸãã ãããè¡ãæ¹æ³ã¯ãèšäºã é«åºŠãªèšºæã»ããã¢ãã ãã§èª¬æãããŠããŸã ã
åŸç¹ äžèšãèæ ®ãããšãMySQLã¯1ããã«ãã£ãã€ã³ããåãåããŸãã
æœåšçã«ãã«ã®ãã€ã³ã¿ãŒã䜿çšãã
V575ã¢ã©ãŒãã¯ã3ã€ã®ãããžã§ã¯ããã¹ãŠã«å¯ŸããŠçºè¡ãããŠããŸãã
Firebirdãããžã§ã¯ãã®ãšã©ãŒäŸïŒäžçšåºŠã®ç¢ºå®æ§ïŒïŒ
static void write_log(int log_action, const char* buff) { .... log_info* tmp = static_cast<log_info*>(malloc(sizeof(log_info))); memset(tmp, 0, sizeof(log_info)); .... }
PVS-StudioèŠå ïŒ V575æœåšçãªãã«ãã€ã³ã¿ãŒã 'memset'é¢æ°ã«æž¡ãããŸãã æåã®åŒæ°ã調ã¹ãŸãã è¡ã確èªããŠãã ããïŒ1106ã1105ãiscguard.cpp 1106
åé¡ã¯äžèšã®åé¡ãšäŒŒãŠããŸã-mallocé¢æ°ã®æ»ãå€ã¯ãã§ãã¯ãããŸããã èŠæ±ãããéã®ã¡ã¢ãªãå²ãåœãŠãããšãã§ããªãã£ãå Žåã mallocã¯nullãã€ã³ã¿ãè¿ãããããmemseté¢æ°ã«æž¡ãããŸãã
MySQLãããžã§ã¯ãã®åæ§ã®ã³ãŒãïŒ
Xcom_member_state::Xcom_member_state(....) { .... m_data_size= data_size; m_data= static_cast<uchar *>(malloc(sizeof(uchar) * m_data_size)); memcpy(m_data, data, m_data_size); .... }
PVS-StudioèŠå ïŒ V575æœåšçãªãã«ãã€ã³ã¿ãŒã 'memcpy'é¢æ°ã«æž¡ãããŸãã æåã®åŒæ°ã調ã¹ãŸãã è¡ããã§ãã¯ïŒ43ã42ãgcs_xcom_state_exchange.cc 43
ãã®ãšã©ãŒã¯ãäžèšã®Firebirdã®åé¡ã«äŒŒãŠããŸãã 念ã®ãããè¿ãããmallocå€ã®NULLäžçåŒããã§ãã¯ãããå ŽæãããããšãæãåºããŸãã ããããããã¯åœŒãã«ã¯åœãŠã¯ãŸããŸããã
PostgreSQLãåæ§ã®ã³ãŒããèŠã€ããŸããã
static void ecpg_filter(const char *sourcefile, const char *outfile) { .... n = (char *) malloc(plen); StrNCpy(n, p + 1, plen); .... }
PVS-StudioèŠå ïŒ V575æœåšçãªãã«ãã€ã³ã¿ãŒã 'strncpy'é¢æ°ã«æž¡ãããŸãã æåã®åŒæ°ã調ã¹ãŸãã è¡ããã§ãã¯ïŒ66ã65ãpg_regress_ecpg.c 66
ãã ããMySQLããã³PostgreSQLãããžã§ã¯ãã®ç¢ºå®æ§ã¬ãã«ãé«ããšããããèå³æ·±ãèŠåããããŸããã
MySQLã®ã³ãŒãã¹ããããïŒ
View_change_event::View_change_event(char* raw_view_id) : Binary_log_event(VIEW_CHANGE_EVENT), view_id(), seq_number(0), certification_info() { memcpy(view_id, raw_view_id, strlen(raw_view_id)); }
PVS-StudioèŠå ïŒ V575 ãmemcpyãé¢æ°ã¯æååå šäœãã³ããŒããŸããã 端æ«ã®ãã«ãä¿æããã«ã¯ããstrcpy / strcpy_sãé¢æ°ã䜿çšããŸãã control_events.cpp 830
memcpyé¢æ°ã䜿çšããŠãæååãraw_view_idããview_idã«ã³ããŒããŸããã³ããŒããããã€ãæ°ã¯ã strlené¢æ°ã䜿çšããŠèšç®ãããŸãã ãã¥ã¢ã³ã¹ã¯ã strlenãçµç«¯ã®ãŒããèæ ®ããã«æååã®é·ããè¿ããããã³ããŒãããªãããšã§ãã ã¿ãŒããã«ãŒããèªåã§è¿œå ããªããšãæååãæäœããããã®é¢æ°ãview_idã§æ£ããæ©èœããªãããšã«æ³šæããŠãã ãã ã æååãæ£ããã³ããŒããã«ã¯ã strcpy / strcpy_sé¢æ°ã䜿çšããå¿ èŠããããŸãã
PostgreSQLã®åæ§ã®ã³ãŒãã®ããã«èŠããŸãã
static int PerformRadiusTransaction(char *server, char *secret, char *portstr, char *identifier, char *user_name, char *passwd) { .... uint8 *cryptvector; .... cryptvector = palloc(strlen(secret) + RADIUS_VECTOR_LENGTH); memcpy(cryptvector, secret, strlen(secret)); }
PVS-StudioèŠå ïŒ V575 ãmemcpyãé¢æ°ã¯æååå šäœãã³ããŒããŸããã 端æ«ã®ãã«ãä¿æããã«ã¯ããstrcpy / strcpy_sãé¢æ°ã䜿çšããŸãã auth.c 2956
åã®ã±ãŒã¹ãšã¯èå³æ·±ãéãããããŸãã cryptvectorå€æ°ã®ã¿ã€ãã¯uint8 *ã§ãã uint8ã¯unsigned charã®ãšã€ãªã¢ã¹ã§ãããšããäºå®ã«ãããããããããŒã¿ãæååã®ããã«æ©èœããªãããšã瀺ãããã«æ瀺çãªæå³ãè¡šçŸãããŠããããã«æããŸãã ãããã£ãŠããã®ã³ã³ããã¹ãã§ã¯ããã®ãããªæäœã¯èš±å¯ãããåã®æäœã®ããã«èŠåãããŸããã
確ãã«ãå®å šæ§ãäœããšæãããã³ãŒãã«ãééããŸããã
int intoasc(interval * i, char *str) { char *tmp; errno = 0; tmp = PGTYPESinterval_to_asc(i); if (!tmp) return -errno; memcpy(str, tmp, strlen(tmp)); free(tmp); return 0; }
PVS-StudioèŠå ïŒ V575 ãmemcpyãé¢æ°ã¯æååå šäœãã³ããŒããŸããã 端æ«ã®ãã«ãä¿æããã«ã¯ããstrcpy / strcpy_sãé¢æ°ã䜿çšããŸãã informix.c 677
äžèšã®ç¶æ³ãšäŒŒãŠããŸãããMySQLã®ã³ãŒãã«è¿ã-æååã䜿çšããããã®å 容ïŒã¿ãŒããã«ãŒããé€ãïŒã¯å€éšã®ã©ããã§äœ¿çšãããã¡ã¢ãªã«ã³ããŒãããŸã...
åŸç¹ Firebird-1ããã«ãã£ãã€ã³ããPostgreSQLããã³MySQL-3ããã«ãã£ãã€ã³ããïŒ1-äžçšåºŠã®ä¿¡é Œã¬ãã«ã®èŠåã2-é«ä¿¡é Œã¬ãã«ã®å ŽåïŒã
æžåŒèšå®é¢æ°ã®æœåšçã«å±éºãªäœ¿çš
V618èŠåã¯ãFirebirdãããžã§ã¯ãã®ã³ãŒãã«å¯ŸããŠã®ã¿çºè¡ãããŸããã
äŸãèããŠã¿ãŸãããïŒ
static const char* const USAGE_COMP = " USAGE IS COMP"; static void gen_based( const act* action) { .... fprintf(gpreGlob.out_file, USAGE_COMP); .... }
PVS-StudioèŠå ïŒ V618ãã®ãããªæ¹æ³ã§ 'fprintf'é¢æ°ãåŒã³åºãã®ã¯å±éºã§ããæž¡ãããè¡ã«åœ¢åŒã®ä»æ§ãå«ãŸããŠããå¯èœæ§ãããããã§ãã å®å šãªã³ãŒãã®äŸïŒprintfïŒ "ïŒ s"ãstrïŒ; cob.cpp 1020
ã¢ãã©ã€ã¶ãŒã¯ããã©ãŒããããããåºåïŒ fprintf ïŒã®é¢æ°ã䜿çšãããŠããããšãèŠåããŸããããåæã«ã察å¿ãã修食åãæã€ãã©ãŒãããæååã䜿çšããã«ãè¡ãçŽæ¥å°å·ãããŸããã ããã¯å±éºãªå Žåããããå°å·ãããè¡ã«åœ¢åŒæå®åãèŠã€ãã£ãå Žåã«è匱æ§ïŒ CVE-2013-4258ãåç §ïŒãåŒãèµ·ããããšãããããŸãã ããã§ã¯ã USAGE_COMPè¡ã¯ãœãŒã¹ã³ãŒãã§æ瀺çã«å®çŸ©ãããŠããã圢åŒæå®åãå«ãã§ããªãããããã®ãããªäœ¿çšã¯æå¹ãšèŠãªãããšãã§ããŸãã
ä»ã®å Žæã§ã¯ãç¶æ³ã¯äŒŒãŠããŸããå°å·ãããè¡ã¯ããŒãã³ãŒãã£ã³ã°ãããŠããã圢åŒæå®åãå«ãã§ããŸããã§ããã
åŸç¹ äžèšã®å 容ãèæ ®ããŠãFirebirdãã眰éãããªãããšã«ããŸããã
è匱æ§ã«é¢ããèšäºã®ãã®ä»ã®èŠå
ãããžã§ã¯ãã®V642ããã³V640èŠåã¯çºè¡ãããŸããã§ãã-ãã¹ãŠãããã£ãã
åæèŠçŽ ã®çããã䜿çš
MySQLã®ãµã³ãã«ã³ãŒãã
enum wkbType { wkb_invalid_type= 0, wkb_first= 1, wkb_point= 1, wkb_linestring= 2, wkb_polygon= 3, wkb_multipoint= 4, wkb_multilinestring= 5, wkb_multipolygon= 6, wkb_geometrycollection= 7, wkb_polygon_inner_rings= 31, wkb_last=31 }; bool append_geometry(....) { .... if (header.wkb_type == Geometry::wkb_multipoint) .... else if (header.wkb_type == Geometry::wkb_multipolygon) .... else if (Geometry::wkb_multilinestring) .... else DBUG_ASSERT(false); .... }
PVS-StudioèŠå ïŒ V768åæå®æ° 'wkb_multilinestring'ã¯ããŒã«åã®å€æ°ãšããŠäœ¿çšãããŸãã item_geofunc.cc 1887
ååãšããŠãèŠåããã¹ãã¯ããèªäœãç©èªã£ãŠããŸãã æ¡ä»¶åŒãèŠããšã2ã€ã¯header.wkb_typeãšGeomertyåæèŠçŽ ã®æ¯èŒã§ããã3çªç®ã®æ¡ä»¶åŒå šäœãåæèŠçŽ ã§ããããšãããããŸãã Geometry :: wkb_multilinestringã®å€ã¯5ã§ããããããã®2ã€ã®ãã§ãã¯ã倱æãããšããã®æ¡ä»¶ã¹ããŒãã¡ã³ãã®æ¬äœãåžžã«å®è¡ãããŸãã ãããã£ãŠã DBUG_ASSERTãã¯ããå«ãelseãã©ã³ãã¯ãŸã£ããå®è¡ãããŸããã æããã«ã3çªç®ã®æ¡ä»¶åŒã®æ£ãã圢åŒã¯æ¬¡ã®ãšããã§ãã
header.wkb_type == Geometry::wkb_multilinestring
ä»ã®ãããžã§ã¯ãã¯ã©ãã§ããïŒ PostgreSQLã§ã¯ããã®ãããªèŠåã¯ãããŸããã§ããããFirebirdã§ã¯9件ããããŸããå®éããããã®èŠåã¯ãã§ã«äžã®ã¬ãã«ïŒäžçšåºŠã®ç¢ºå®æ§ïŒã«ãããæ€åºããããã¿ãŒã³ãç°ãªããŸãã
V768蚺æã«ãŒã«ã«ãã£ãŠæ€åºããããšã©ãŒã®æ€çŽ¢ãã¿ãŒã³ã¯æ¬¡ã®ãšããã§ãã
- é«ã確å®æ§ïŒåæåã¡ã³ããŒãè«çååŒãšããŠäœ¿çšããŸãã
- äžçšåºŠã®ç¢ºå®æ§ïŒåæåã®å€æ°ãè«çåã®åŒãšããŠäœ¿çšããŸãã
ãããã£ãŠãæåã®ã±ãŒã¹ã§ããŸããããªãå Žåã§ãã2çªç®ã®ä¿¡é Œã¬ãã«ã§ã¢ãã©ã€ã¶ãŒã®èŠåãšäœããã®åœ¢ã§è°è«ããããšãã§ããŸãã
ããšãã°ãã»ãšãã©ã®å Žåã¯æ¬¡ã®ãããªãã®ã§ãã
enum att_type { att_end = 0, .... }; void fix_exception(...., att_type& failed_attrib, ....) { .... if (!failed_attrib) .... }
PVS-StudioèŠå ïŒ V768å€æ°ãfailed_attribãã¯åæåã§ãã ããŒã«åã®å€æ°ãšããŠäœ¿çšãããã®ã¯å¥åŠã§ãã restore.cpp 8580
ã¢ãã©ã€ã¶ãŒã¯ã failed_attribå€æ°ã®å€ãatt_type :: att_endã§ããããšã確èªããã³ãŒããçããããšèŠãªããŸãã ã ããšãã°ãåæèŠçŽ ãšã®æ瀺çãªæ¯èŒã奜ãã§ãããã ãã ãããã®ã³ãŒããééã£ãŠãããšã¯èšããŸããã ã¯ãããã®ã¹ã¿ã€ã«ïŒããã³ã¢ãã©ã€ã¶ãŒãïŒã¯å¥œãã§ã¯ãããŸããããã³ãŒãã¯æå¹ã§ãã
ããããããäžå¯©ã«èŠããå Žæã2ã€ãããŸãã ãã¿ãŒã³ã¯åããªã®ã§ã1ã€ã®ã±ãŒã¹ã®ã¿ãæ€èšããŠãã ããã
namespace EDS { .... enum TraScope {traAutonomous = 1, traCommon, traTwoPhase}; .... } class ExecStatementNode : .... { .... EDS::TraScope traScope; .... }; void ExecStatementNode::genBlr(DsqlCompilerScratch* dsqlScratch) { .... if (traScope) .... .... }
PVS-StudioèŠå ïŒ V768å€æ° 'traScope'ã¯åæåã§ãã ããŒã«åã®å€æ°ãšããŠäœ¿çšãããã®ã¯å¥åŠã§ãã stmtnodes.cpp 3448
ã³ãŒãã¯åã®ã³ãŒãã«äŒŒãŠããŸã-圌ãã¯ãŸãã traScopeå€æ°ã«å®éã®éãŒãå€ãæã€åæèŠçŽ ã®å€ãå«ãŸããŠããããšã確èªãããã£ãã®ã§ãã ãã ããããã§ã¯ãåã®äŸãšã¯ç°ãªããå®éã®å€ãã0ãã®åæèŠçŽ ã¯ãããŸããã ãããã£ãŠããã®ã³ãŒãã¯åã®ã³ãŒããããçãããããã«èŠããŸãã
å¹³åã¬ãã«ã®ä¿¡é ŒåºŠã®èŠåã«ã€ããŠè©±ããŠããã®ã§ãããããMySQLã§ãèŠã€ãã£ãããšãè¿œå ãã䟡å€ããããŸã-10åã
åŸç¹ Firebirdã¯ãããã«ãã£ãã€ã³ã1ã€ãMySQL-2ãåãåããŸãã
äžæ£ãªã¡ã¢ãªãããã¯ãµã€ãºã®èšç®
ãšããã§ãããã«ãã1ã€ã®èå³æ·±ãã³ãŒãããããŸããããã«ãã¡ã¢ãªå ã®ãã©ã€ããŒãããŒã¿ã®äžæžããåŠçããéã«ããã§ã«ä»¥åã«åœŒã«ç®ãåããŸããã
struct win32op { int fd_setsz; struct win_fd_set *readset_in; struct win_fd_set *writeset_in; struct win_fd_set *readset_out; struct win_fd_set *writeset_out; struct win_fd_set *exset_out; RB_HEAD(event_map, event_entry) event_root; unsigned signals_are_broken : 1; }; void win32_dealloc(struct event_base *_base, void *arg) { struct win32op *win32op = arg; .... memset(win32op, 0, sizeof(win32op)); free(win32op); }
PVS-StudioèŠåïŒV579 memseté¢æ°ã¯ããã€ã³ã¿ãŒãšãã®ãµã€ãºãåŒæ°ãšããŠåãåããŸããééããããããŸããã 3çªç®ã®åŒæ°ã調ã¹ãŸããwin32.c 442 memset
é¢æ°åŒã³åºãã®3çªç®ã®åŒæ°ã«æ³šæããŠãã ãããsizeofæŒç®åã¯åŒæ°ã®ãµã€ãºããã€ãåäœã§è¿ããŸããããã®å ŽåãåŒæ°ã¯ãã€ã³ã¿ãŒã§ãããããã£ãŠãsizeofæŒç®åã¯æ§é äœã®ãµã€ãºã§ã¯ãªãããã€ã³ã¿ãŒã®ãµã€ãºãè¿ããŸãããã®ãããmemseté¢æ°åŒã³åºããåé€ãããªãå Žåã§ããã¡ã¢ãªãµã€ãºã¯å¿ èŠéãããå°ãªããªããŸããé埳-å€æ°åãæ éã«éžæããæ··ä¹±ããããå€æ°åãé¿ããŠãã ããããã®ãããªååãªãã§ã¯ã§ããªãããšããããŸããããã®ãããªå Žåã¯äºéã«æ³šæããå¿ èŠããããŸããå€ãã®ãšã©ãŒãããã«é¢é£ä»ããããŠãããV501蚺æã«ãŒã«ã䜿çšããŠæ€åºã§ããŸãã
ã§C / C ++ãããžã§ã¯ãããã³V3001ã§ã®CïŒãããžã§ã¯ãã
ä»ã®ãããžã§ã¯ãã§ã¯ãV579ã®èŠåã¯èŠã€ãããŸããã§ããã
åŸç¹ MySQLã®2ããã«ãã£ãã€ã³ãã
åæ§ã®ãšã©ãŒããããŸãããåã³MySQLã§ã
typedef char Error_message_buf[1024]; const char* get_last_error_message(Error_message_buf buf) { int error= GetLastError(); buf[0]= '\0'; FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, error, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR)buf, sizeof(buf), NULL ); return buf; }
PVS-Studio èŠåïŒV511 sizeofïŒïŒæŒç®åã¯ãé åã®ãµã€ãºã§ã¯ãªãããã€ã³ã¿ãŒã®ãµã€ãºã 'sizeofïŒbufïŒ'åŒã§è¿ããŸããcommon.cc 507
Error_message_buf - charåã®1024èŠçŽ ã®é åã®ãšã€ãªã¢ã¹ã1ã€ã®éèŠãªç¹ã«çæããŠãã ãã-é¢æ°ã®ã·ã°ããã£ã次ã®å Žåã§ã
const char* get_last_error_message(char buf[1024])
bufã¯ãã€ã³ã¿ãŒã§ããããã®åŸã«çãããã¹ãŠã®çµæã䌎ããŸããé åã®ãµã€ãºã¯ããã°ã©ããŒãžã®ãã³ãã«ãããŸããããããã£ãŠãäžèšã®ã³ãŒããã©ã°ã¡ã³ãã§ã¯ãsizeofïŒbufïŒåŒã¯é åã§ã¯ãªããã€ã³ã¿ãŒã§æ©èœããŠããŸãããã®çµæãé¢æ°ã¯ééã£ããããã¡ãµã€ãºãåãåããŸã-1024ã§ã¯ãªã4ãŸãã¯8ãFirebird
ãšPostgreSQLã§ã¯ãåæ§ã®èŠåã¯åã³ãããŸããã§ããã
åŸç¹ MySQLã®2ã€ã®ããã«ãã£ãã€ã³ãã
ã¹ããŒããŒã¯ãŒãããããŸãã
ããäžã€ã®èå³æ·±ãééãããããŠä»åã¯...åã³MySQLãããã³ãŒããã©ã°ã¡ã³ãã¯å°ãããããå šäœã瀺ããŸãã
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 std :: runtime_error
ã¯ã©ã¹ã®ãªããžã§ã¯ããäœæãããŸããã䜿çšãããŸãããæããã«ãäŸå€ã¯ã¹ããŒãããããšãæå³ããŠããŸããããããã°ã©ãã¯throwããŒã¯ãŒããæå®ããã®ãå¿ããŠããŸããããã®çµæãäŸå€ïŒactive_connection == nullptrïŒã¯æåŸ ã©ããã«åŠçãããŸããã
FirebirdãPostgreSQLããã®ãããªèŠåã¯ãããŸããã§ããã
åŸç¹ MySQLã®2ã€ã®ããã«ãã£ãã€ã³ãã
Invalid Memory Freeã¹ããŒãã¡ã³ãã®åŒã³åºã
次ã®ã³ãŒããµã³ãã«ã¯ãFirebirdãããžã§ã¯ãããååŸãããã®ã§ãã
class Message { .... void createBuffer(Firebird::IMessageMetadata* aMeta) { unsigned l = aMeta->getMessageLength(&statusWrapper); check(&statusWrapper); buffer = new unsigned char[l]; } .... ~Message() { delete buffer; .... } ..... unsigned char* buffer; .... };
PVS-Studio èŠåïŒV611ã¡ã¢ãªã¯ãnew T []ãæŒç®åã䜿çšããŠå²ãåœãŠãããŸãããããdeleteãæŒç®åã䜿çšããŠè§£æŸãããŸããããã®ã³ãŒãã調ã¹ãããšãæ€èšããŠãã ããããdelete [] buffer;ãã䜿çšããããšããå§ãããŸããã©ã€ã³ãã§ãã¯ïŒ101ã237 message.h 101
ïŒãã€ã³ã¿ã«ãã£ãŠåç §ããããããã¡ã¡ã¢ãªãããã¡' -ã®ã¯ã©ã¹ãã£ãŒã«ãã®ã¡ãã»ãŒãžãïŒç¹å¥ãªæ¹æ³ã§å²ãåœãŠããã- createBufferäºæ³éãããããŠãããã¯ãªãã¬ãŒã¿äœ¿çšæ°èŠã®[] ãããããã¯ã©ã¹ãã¹ãã©ã¯ã¿ã¯ããªãã¬ãŒã¿ã«ãã£ãŠäœ¿çšãããã¡ã¢ãªã解æŸããããã«åé€ãã代ããã«]ãåé€[ã
MySQLããã³PostgreSQLã«ã¯ãã®ãããªãšã©ãŒã¯ãããŸããã§ããã
åŸç¹ Firebirdã®2ããã«ãã£ãã€ã³ãã
ãŸãšãããš
ããã«ãã£ãã€ã³ããåèšãããšã次ã®çµæãåŸãããŸãã
- FirebirdïŒ1 + 1 + 2 = 4ãã€ã³ãã
- MySQLïŒ3 + 1 + 2 + 2 + 2 + 2 = 12ãã€ã³ãã
- PostgreSQLïŒ3ãã€ã³ãã
ãã€ã³ããå°ãªãã»ã©è¯ãããšãæãåºããŸãããããŠãããã§ç§ïŒçããããã奜ã¿ãæã€äººïŒãæã奜ãã ã£ã... MySQLïŒããã«ã¯æãèå³æ·±ããšã©ãŒãå«ãŸããŠããŠããã®å Žæã§ããã¹ãŠãæ確ã§ã-ããã«ããã®ã¯ãåæã®ããã®çæ³çãªãããžã§ã¯ãã§ãïŒ
FirebirdãšPostgreSQLã§ã¯ãäºæ ã¯ããã«è€éã«ãªããŸããäžæ¹ã§ã¯ã1ã€ã®ãã€ã³ãã®ã®ã£ããã¯äŸç¶ãšããŠã®ã£ããã§ãããä»æ¹ã§ã¯ãç¹ã«ãã®ã¹ã³ã¢ãå¹³åã¬ãã«ã®ä¿¡é Œæ§ã§V768ã«ã€ããŠååŸãããŠãããããããªãå°ããå·®ã§ããèªåçæã³ãŒãã«é¢ããã¢ã©ãŒã...
äžè¬ã«ãFirebirdãšPostgreSQLã«é¢ããŠãiããdotããããã«ã¯ããã培åºçãªåæãè¡ãå¿ èŠããããŸãããä»ã®ãšããããããã1ãæã«çœ®ããŠã誰ãæ°åã害ããããšã¯ãªããšæããŸãããã€ãããããã®2ã€ã®ãããžã§ã¯ãã®æ¯èŒã«ããæ éã«ã¢ãããŒãã§ããããã«ãªããããããŸããããããã¯ãŸã£ããç°ãªã話ã§ã...
çµæã¯ã³ãŒãã®å質ã«ãã£ãŠè©äŸ¡ãããŸãã
- 1äœ-FirebirdãšPostgreSQLã
- 2äœ-MySQLã
![](https://habrastorage.org/getpro/habr/post_images/a39/4b1/bfd/a394b1bfd3919b813ddfcfa202d5097a.png)
ãããŠããäžåºŠããããå«ãããããã¬ãã¥ãŒãšæ¯èŒã¯äž»èŠ³çãªãã®ã§ãããããã€ãã®å Žåãç°ãªãã¢ãããŒãã䜿çšãããšçµæãç°ãªãå¯èœæ§ãããããšãæãåºããããšæããŸãïŒããããããã¯FirebirdãšPostgreSQLã®å Žåãå€ãã§ããã MySQLïŒã
éç解æã¯ã©ãã§ããïŒããŸããŸãªçš®é¡ã®æ¬ é¥ãæ€åºããããšã®æçšæ§ãå®èšŒã§ããããšãé¡ã£ãŠããŸããã³ãŒãããŒã¹ã«ãã®ãããªãã®ããããã©ããã確èªãããã§ããïŒããã¯æéã PVSã®-ã¡ãŒã«ãŒãè©ŠããŠã¿ãŠãã ããïŒãšã©ãŒãªãã§ã³ãŒããæžããŸããïŒååã®ã³ãŒãã確èªããŠãã ãã;ïŒ
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒã»ã«ã²ã€ãŽã¡ã·ãªãšãã FirebirdãMySQLãPostgreSQLã®ã³ãŒãå質ã®æ¯èŒ
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§åçãåéããŸããïŒ PVS-StudioããŒãžã§ã³2015ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã