å°ãåãŸã§ãOpenSSLã«è匱ãªäººãã話ããªãè匱æ§ãçºèŠãããŸããã PVS-Studioã¯ããã®è匱æ§ã«ã€ãªãããšã©ãŒãèŠã€ããããšãã§ããªãããšãç¥ã£ãŠããŸãã ãããã£ãŠãOpenSSLã«é¢ããèšäºãæžãçç±ã¯ãªããšå€æããŸããã æè¿ã§ã¯ããã®ãããã¯ã«é¢ããèšäºãå€ãããŸãã ãã ããPVS-Studioã§ãã®ãšã©ãŒãæ€åºã§ãããã©ãããå°ããæçŽã倧éã«å±ããŸããã ç§ã¯ãããããŠãã®èšäºãæžããŸããã
OpenSSLãæ€èšŒãã
OpenSSLã«æ·±å»ãªè匱æ§ãçºèŠãããããšã¯èª°ããæ¢ã«ç¥ã£ãŠãããšæããŸã ã ããã§ãã誰ãããããèŠéãããã詳现ãç¥ãããå Žåã¯ããã®ãããã¯ã«é¢ããããã€ãã®èšäºã«ç²Ÿéããããšãææ¡ããŸãã
- ããŒãããªãŒããã° ã
- ååšããã¿ã€ãã®å±æ©ïŒOpenSSL Heartbleed Bugã®èšºæ ã
- ãŠã£ãããã£ã¢ ããŒãããªãŒã
- ããŒãããªãŒã
- éèŠãªè³ªåãžã®åçïŒHeartbleedã䜿çšããŠãã©ã€ããŒãSSLããŒãååŸã§ããŸããïŒ
- NSAã¯äœå¹Žãç¥æ§ã®ããã«Heartbleed Bugãå©çšãããšèšããŸãã ã
- æ·±å»ãªãããŒãããªãŒããã»ãã¥ãªãã£æ¬ é¥ãå°å ¥ããç·æ§ã¯ãæå³çã«æ¿å ¥ããããšãåŠå®ããŸãã
- ããŒãããªãŒãã®ããããªã¹ãïŒä»ããå€æŽããå¿ èŠããããã¹ã¯ãŒã
- ãªãŒãã³ãœãŒã¹ãœãããŠã§ã¢ã¯ãä»ã®ãã¹ãŠãé€ããŠææªã®çš®é¡ã§ãã
OpenSSLããã¹ãããŸããã ãã®ãããã¯ã«é¢ããã¡ã¢ã¯æ¬¡ã®ãšããã§ããã OpenSSLã«ã€ããŠå°ã説æããŸã ãã ç§ãã¡ãèŠã€ãããã®ã§ãããããã¯æ·±å»ãªãã®ã§ã¯ãªãããã§ãã çŸåšããããã®ãšã©ãŒã¯ä¿®æ£ãããŠããŸãã ã ããç¡é§ã«ãã§ãã¯ãããŠããŸããã
ãã§ã«Heartbleedã®ãã°ãããå Žåã«OpenSSLããã§ãã¯ãããã©ããã¯æå®ããŸããã§ããã ãããã«ãããPVS-Studioã¯ãã®ãããªãã°ãæ€åºã§ããªãããšãç¥ã£ãŠããŸãã äžè¬çã«æ€åºããããšã¯å°é£ã§ãã OpenSSLãããžã§ã¯ãã¯ããŸããŸãªããŒã«ã§ãã§ãã¯ããã³ãã§ãã¯ãããŸãããããããã®ããŒã«ã§ããã®ââãšã©ãŒã¯èŠã€ãããŸããã§ããã ããšãã°ãCoverity Scanã³ãŒãã¢ãã©ã€ã¶ãŒã®ãªãŒããŒã§ããééãã¯èŠã€ãããŸããã§ããã ããã«é¢ãã泚èšïŒã Heartbleed and Static Analysis ããã Heartbleed and Static Analysis ïŒ2ïŒ ãã
å®éãéçåæã䜿çšããŠãã®ãããªãšã©ãŒãèŠã€ããããšã¯éåžžã«å°é£ã§ãã ã³ãŒãããããã«ããã§ãã ã¡ã¢ãªã«ä¿åãããŠããå€ãèæ ®ããå¿ èŠããããæ瀺çãªåå€æã®èåŸã«é ãããŠãããã®ãç解ããå¿ èŠããããŸãã 人ã§ãã£ãŠãåé¡ãäœã§ããããç解ããããšã¯å°é£ã§ãã éçã¢ãã©ã€ã¶ãŒã¯ãããééããŸãã ããã¯éçåææ¹æ³è«ã®æ¬ é¥ã§ã¯ãããŸããã ééãã¯æ¬åœã«è€éã ãšããã ãã§ãã ããããããã®ãããªæ§é ãæ€çŽ¢ããããã«äºåã«ãã¬ãŒãã³ã°ããªããšããã®ãããªæ¬ é¥ãèŠã€ããããšãã§ããããŒã«ã¯ãããŸããã
ãœãããŠã§ã¢ããã¯ããŒã¯ãæ€çŽ¢ããããã«èšèšãããæ¢ç¥ããã³æªç¥ã®éç解æããŒã«ããŸã ããããšã«æ³šæããŠãã ããã ãããããã®ãããªããŒã«ã¯è匱æ§ãèŠã€ããå¯èœæ§ããããŸãããç§ã¯ããã匷ãçããŸãã èŠã€ãã£ãå Žåã¯ãã¢ãã©ã€ã¶ãŒã®åºåãšããŠäœ¿çšããŸãã ãã¡ãããç¹å¥ãªãµãŒãã¹å ã§éçºãããããã€ãã®ããŒã«ããã®è匱æ§ãèŠã€ãããªãã·ã§ã³ããããŸããã圌ãã¯ããã«ã€ããŠç¹ã«è©±ããŸããã ããããé°è¬è«ã¯ããããå§ãŸãã®ã§ãããã«ã€ããŠã¯è©±ããŸãããã
ç§ã®å人çãªæèŠã ããã¯åãªãééãã§ãããããã¯ããŒã¯ã§ã¯ãããŸããã éçåæããŒã«ã¯è€éã§ããããããããæ€åºããæ¹æ³ãç¥ããŸããã 以äžã§ãã
ããã§èšäºãçµäºã§ããŸãããããã§ã¯ãªãããŸã£ããé¢çœããªãã§ãããã ããã§ã PVS-Studio㧠OpenSSLãå床ãã§ãã¯ããŸããã ç¹å¥ãªãã®ã¯èŠã€ãããŸããã§ããããããã§ãã³ãŒãã®ããã€ãã®ã»ã¯ã·ã§ã³ãèŠãŠã¿ãŸãããã
ãªããããªã«å°ãªãã®ã§ããïŒ ã¯ããOpenSSLã¯è³ªã®é«ããããžã§ã¯ãã ããã§ãã æ·±å»ãªè匱æ§ãèŠã€ãã£ããããšãã£ãŠãã³ãŒããã²ã©ããšããããã§ã¯ãããŸããã å€ãã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ãã¯ããã«å€§ããªç©Žãããã誰ããããå¿ èŠãšããªããšæããŸãã ããã«ãOpenSSLãããžã§ã¯ãã¯å€ãã®ããŒã«ã§ãã¹ããããŠããŸãã
åæçµæ
ç¹°ãè¿ããŸãããç¹å®ã®ãšã©ãŒã¯èŠã€ãããŸããã§ããã 以äžã®ããã¹ãããšã©ãŒã®èª¬æãšããŠã§ã¯ãªããäžæ£ç¢ºã«æããã³ãŒãã«å¯Ÿããã³ã¡ã³ããšããŠèãããšããã§ãããã ããšãã象ãèšããŸããŠãããšããã³ã¡ã³ãã¯åŸã§èŠãããããŸããã
çãããæ¯èŒ
typedef struct ok_struct { .... size_t buf_len_save; size_t buf_off_save; .... } BIO_OK_CTX; static int ok_read(BIO *b, char *out, int outl) { .... BIO_OK_CTX *ctx; .... /* copy start of the next block into proper place */ if(ctx->buf_len_save - ctx->buf_off_save > 0) .... }
PVS-StudioèŠåïŒV555ãA-B> 0ããšããè¡šçŸã¯ãAïŒ= BããšããŠæ©èœããŸãã bio_ok.c 243
åŒïŒctx-> buf_len_save-ctx-> buf_off_save> 0ïŒã¯ãäžèŠæããããããããŸãããæ©èœããŸããã
ããã§ã圌ãã¯æ¡ä»¶ããã§ãã¯ãããããã§ãïŒctx-> buf_len_save> ctx-> buf_off_saveïŒã ããã§ã¯ãããŸããã å®éãæ¯èŒãããå€æ°ã¯ç¬Šå·ãªãã®åã§ãã 1ã€ã®ç¬Šå·ãªãå€æ°ãå¥ã®ç¬Šå·ãªãå€æ°ããæžç®ãããšã笊å·ãªãã®åã®çµæãçæãããŸãã
å€æ°ãäžèŽããªãå Žåãæ¡ä»¶ïŒctx-> buf_len_save-ctx-> buf_off_save> 0ïŒã¯åžžã«æºããããŸãã ã€ãŸãã次ã®2ã€ã®åŒã¯åçã§ãã
- ïŒctx-> buf_len_save-ctx-> buf_off_save> 0ïŒ
- ïŒctx-> buf_len_saveïŒ= ctx-> buf_off_saveïŒ
Cèšèªã«ããŸã詳ãããªã人ã®ããã®èª¬æã çµéšè±å¯ãªéçºè ã¯èªãããšãã§ããŸããã
2ã€ã®32ããã笊å·ãªãå€æ°ããããšããŸãã
笊å·ãªãA = 10;
笊å·ãªãB = 20;
æ¡ä»¶ïŒA-B> 0ïŒãæºããããŠãããã©ããã確èªããŸãã
æžç®ã®çµæïŒA-BïŒã¯ã10u-20u = 0xFFFFFFF6u = 4294967286uã§ãã
次ã«ã笊å·ãªãã®æ°å€4294967286uããŒããšæ¯èŒããŸãã ãŒãã笊å·ãªãã®åã«ãã£ã¹ããããŸãããããã¯åé¡ã§ã¯ãããŸããã
åŒïŒ4294967286u> 0uïŒã¯çã§ãã
åŒïŒA-B> 0ïŒã¯ãA == Bã®å Žåã1ã€ã®å Žåã«ã®ã¿åœãšãªããŸãã
ãã®æ¯èŒã¯ééãã§ããïŒ ãããžã§ã¯ãããã€ã¹ã«ç²ŸéããŠããªããããããããŸããã ééããªããšæããŸãã
ã»ãšãã©ã®å Žåããããäºå®ã§ãã å€æ° 'buf_len_save'ã¯éåžžãå€æ° '' buf_off_save 'ããã倧ãããªããŸãã å€æ° 'buf_off_save'ã®å€ã 'buf_len_save'ã«ä¿åãããŠããå€ã«éããå ŽåããããŸãã ãã®å Žåãå€æ°ãåãã§ããããã®ãã§ãã¯ãå¿ èŠãªå Žåã ïŒbuf_len_save <buf_off_saveïŒã®ã±ãŒã¹ã¯ããããäžå¯èœã§ãã
ãã©ãã«ãåŒãèµ·ãããªãåæåãããŠããªãå€æ°
åæåãããŠããªãå€æ°ã䜿çšã§ããå ŽæããããŸãã ãããããããæªãçµæãããããããšã¯ãããŸããã ãã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
int PEM_do_header(....) { int i,j,o,klen; .... if (o) o = EVP_DecryptUpdate(&ctx,data,&i,data,j); if (o) o = EVP_DecryptFinal_ex(&ctx,&(data[i]),&j); .... j+=i; if (!o) { PEMerr(PEM_F_PEM_DO_HEADER,PEM_R_BAD_DECRYPT); return(0); } .... }
PVS-StudioèŠåïŒV614æœåšçã«åæåãããŠããªãå€æ°ãiãã䜿çšãããŸããã pem_lib.c 480
ïŒo == falseïŒã®å Žåãå€æ° 'i'ã¯åæåãããŠããªãå¯èœæ§ããããŸãã ãã®çµæããjãã«äœãè¿œå ããããã¯æ確ã§ã¯ãããŸããã ïŒo == falseïŒã®å Žåããšã©ãŒãã³ãã©ãŒãèµ·åããé¢æ°ãåäœãåæ¢ãããããããã¯æããããããŸããã
ã³ãŒãã¯æ£ããã§ãããæ£ç¢ºã§ã¯ãããŸããã æåã«å€æ°ãoãã確èªãããã®åŸã§ãiãã䜿çšããããšããå§ãããŸãã
if (!o) { PEMerr(PEM_F_PEM_DO_HEADER,PEM_R_BAD_DECRYPT); return(0); } j+=i;
å¥åŠãªèª²é¡
#define SSL_TLSEXT_ERR_ALERT_FATAL 2 int ssl3_accept(SSL *s) { .... if (ret != SSL_ERROR_NONE) { ssl3_send_alert(s,SSL3_AL_FATAL,al); if (al != TLS1_AD_UNKNOWN_PSK_IDENTITY) SSLerr(SSL_F_SSL3_ACCEPT,SSL_R_CLIENTHELLO_TLSEXT); ret = SSL_TLSEXT_ERR_ALERT_FATAL; ret= -1; goto end; } .... }
PVS-StudioèŠåïŒV519ãretãå€æ°ã«ã¯é£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªïŒ376ã377ãs3_srvr.c 377
æåã«ãå€æ°ãretãã«å€2ãå²ãåœãŠããã次ã«-1ãå²ãåœãŠãããŸãã ãããããæåã®å²ãåœãŠã¯äžèŠã§ãããå¶ç¶ã«ã³ãŒãã«æ®ã£ãŠããã§ãããã
å¥ã®ã±ãŒã¹ïŒ
int dtls1_retransmit_message(....) { .... /* save current state */ saved_state.enc_write_ctx = s->enc_write_ctx; saved_state.write_hash = s->write_hash; saved_state.compress = s->compress; saved_state.session = s->session; saved_state.epoch = s->d1->w_epoch; saved_state.epoch = s->d1->w_epoch; .... }
PVS-StudioèŠåïŒV519ãsaved_state.epochãå€æ°ã«ã¯ãé£ç¶ããŠ2åå€ãå²ãåœãŠãããŸãã ããããããã¯ééãã§ãã è¡ã確èªããŠãã ããïŒ1277ã1278ãd1_both.c 1278
æœåšçãªNULLãã€ã³ã¿ãŒã®éåç §
ïŒ ç§ã®çµéšã§ã¯ ïŒããã°ã©ã ã§æããããã倱æã¯ããã§ãã¯ãããåã«ãã€ã³ã¿ãŒãéåç §ããããšã§ãã ããã¯å¿ ãããééãã§ã¯ãããŸããã å€ãã®å Žåããã€ã³ã¿ãŒãnullã«ãªãããšã¯ãããŸããã ãã ããããã¯æœåšçã«å±éºãªã³ãŒãã§ãã ç¹ã«ãããžã§ã¯ããæ¥éã«å€åããå Žåã
OpenSSLã«ã¯ãã®ãããªééãããããŸãã
int SSL_shutdown(SSL *s) { if (s->handshake_func == 0) { SSLerr(SSL_F_SSL_SHUTDOWN, SSL_R_UNINITIALIZED); return -1; } if ((s != NULL) && !SSL_in_init(s)) return(s->method->ssl_shutdown(s)); else return(1); } .... }
PVS-StudioèŠåïŒV595 nullptrã«å¯ŸããŠæ€èšŒãããåã«ã 's'ãã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªããŠãã ããïŒ1013ã1019ãssl_lib.c 1013
æåã¯ããã€ã³ã¿ãŒãsãã䜿çšãããŸãïŒïŒs-> handshake_func == 0ïŒã
ãããŠãããã ãããã§ãã¯ãããŸãïŒïŒsïŒ= NULLïŒã
å¥ã®ããè€éãªã±ãŒã¹ïŒ
#define bn_wexpand(a,words) \ (((words) <= (a)->dmax)?(a):bn_expand2((a),(words))) static int ubsec_dh_generate_key(DH *dh) { .... if(bn_wexpand(pub_key, dh->p->top) == NULL) goto err; if(pub_key == NULL) goto err; .... }
PVS-StudioèŠåïŒV595 nullpubrã«å¯ŸããŠæ€èšŒãããåã«ã 'pub_key'ãã€ã³ã¿ãŒã䜿çšãããŸããã è¡ã確èªïŒ951ã952ãe_ubsec.c 951
ãšã©ãŒã®å Žæãç解ããã«ã¯ããã¯ããå±éããå¿ èŠããããŸãã 次ã«ã次ã®ã³ãŒããååŸããŸãã
if((((dh->p->top) <= (pub_key)->dmax)? (pub_key):bn_expand2((pub_key), (dh->p->top))) == ((void *)0)) goto err; if(pub_key == ((void *)0)) goto err;
ãã€ã³ã¿ãŒãpub_keyãã«æ³šæããŠãã ããã
æåã¯éåç §ãããŸãïŒïŒpub_keyïŒ-> dmaxã
以äžã§ã¯ããŒããšçãããã©ããããã§ãã¯ãããŸãïŒïŒpub_key ==ïŒïŒvoid *ïŒ0ïŒïŒã
è¿œå ã®ãã§ãã¯
å€æ°ãåãå€ã§2åæ¯èŒãããã³ãŒããããã€ããããŸãã ããã¯ééãã§ã¯ãªããšæããŸãã 2åç®ã®ãã§ãã¯ã ããå¶ç¶ã«æžãããŠãããäœåãªãã®ã§ããããã§ãã åé€ã§ããŸãã
è¿œå ãã§ãã¯N1
int ASN1_PRINTABLE_type(const unsigned char *s, int len) { .... if (!( ((c >= 'a') && (c <= 'z')) || ((c >= 'A') && (c <= 'Z')) || (c == ' ') || <<<<==== ((c >= '0') && (c <= '9')) || (c == ' ') || (c == '\'') || <<<<==== (c == '(') || (c == ')') || (c == '+') || (c == ',') || (c == '-') || (c == '.') || (c == '/') || (c == ':') || (c == '=') || (c == '?'))) ia5=1; .... }
PVS-StudioèŠåïŒV501ã||ãã®å·Šãšå³ã«åäžã®ãµãåŒãïŒc ==ããïŒãããããŸã æŒç®åã a_print.c 76
ã<<<< ====ãã䜿çšããŠåäžã®ãã§ãã¯ã匷調衚瀺ããŸããã ãã®éè€ãã§ãã¯ã«ã€ããŠã¯åã®èšäºã§æžããŸããããä¿®æ£ãããŠããŸããã ãããã£ãŠãããã¯ééããªãåé¡ã§ã¯ãããŸããã
è¿œå ãã§ãã¯N2ãN3
int ssl3_read_bytes(SSL *s, int type, unsigned char *buf, int len, int peek) { .... if ((type && (type != SSL3_RT_APPLICATION_DATA) && (type != SSL3_RT_HANDSHAKE) && type) || (peek && (type != SSL3_RT_APPLICATION_DATA))) .... }
PVS-StudioèŠåïŒV501ã&&ãæŒç®åã®å·ŠåŽãšå³åŽã«åããåŒãã®éšååŒããããŸãã s3_pkt.c 952
å€æ° 'type'ã®å€ããŒã以å€ã§ããããšã2å確èªãããŸãã
èæ ®ãããã³ãŒããã©ã°ã¡ã³ãã¯å¥ã®ãã¡ã€ã«ã«ã³ããŒããããããd1_pkt.c 760ãšããäžèŠãªæ¯èŒããããŸãã
è¡ã®é·ããç¡å¹ã§ã
ããžãã¯å®æ°ã䜿çšããŠæååã®é·ããèšå®ããã®ã¯è¯ããããŸããã ééããç¯ãã®ã¯ãšãŠãç°¡åã§ãã OpenSSLã§ã¯ãPVS-Studioã¢ãã©ã€ã¶ãŒã¯ãã®ãããª3ã€ã®å Žæã«æ°ä»ããŸããã
æåã«å€±æããããžãã¯ãã³ããŒ
ãããééãã§ããããšã瀺ãããã«ãBIO_writeé¢æ°ãåŒã³åºãããã€ãã®äŸãèŠãŠã¿ãŸãããã
- BIO_writeïŒbpãããšã³ã³ãŒãã®ãšã©ãŒ\ nãã18ïŒ
- BIO_writeïŒbpãã\ nãã1ïŒ
- BIO_writeïŒbpããïŒãã1ïŒ
- BIO_writeïŒbpããïŒBAD OBJECTãã11ïŒ
- BIO_writeïŒbpããBad boolean \ nãã12ïŒ
ãããŠä»ãééã£ãã³ãŒãïŒ
static int asn1_parse2(....) { .... if (BIO_write(bp,"BAD ENUMERATED",11) <= 0) goto end; .... }
PVS-StudioèŠåïŒV666é¢æ°ãBIO_writeãã®3çªç®ã®åŒæ°ã調ã¹ãããšãæ€èšããŠãã ããã å€ãã2çªç®ã®åŒæ°ã§æž¡ãããæååã®é·ããšäžèŽããªãå¯èœæ§ããããŸãã asn1_par.c 378
æååãBAD ENUMERATEDãã®é·ãã¯11æåã§ã¯ãªãã14æåã§ãã
倱æãã2çªç®ã®ããžãã¯ãã³ããŒ
static int www_body(char *hostname, int s, unsigned char *context) { .... if ( ((www == 1) && (strncmp("GET ",buf,4) == 0)) || ((www == 2) && (strncmp("GET /stats ",buf,10) == 0))) .... }
PVS-StudioèŠåïŒV666é¢æ° 'strncmp'ã®3çªç®ã®åŒæ°ã調ã¹ãããšãæ€èšããŠãã ããã å€ããæåã®åŒæ°ã§æž¡ãããæååã®é·ããšäžèŽããªãå¯èœæ§ããããŸãã s_server.c 2703
æååãGET / statsãã®é·ãã¯10æåã§ã¯ãªãã11æåã§ãã æåŸã®ã®ã£ããã¯èæ ®ãããŸããã ãã€ããŒãªæ¬ é¥ã§ãããããã§ãæ¬ é¥ã§ãã
倱æãã3çªç®ã®ããžãã¯ãã³ããŒ
static int asn1_cb(const char *elem, int len, void *bitstr) { .... if (!strncmp(vstart, "ASCII", 5)) arg->format = ASN1_GEN_FORMAT_ASCII; else if (!strncmp(vstart, "UTF8", 4)) arg->format = ASN1_GEN_FORMAT_UTF8; else if (!strncmp(vstart, "HEX", 3)) arg->format = ASN1_GEN_FORMAT_HEX; else if (!strncmp(vstart, "BITLIST", 3)) arg->format = ASN1_GEN_FORMAT_BITLIST; else .... }
PVS-StudioèŠåïŒV666é¢æ° 'strncmp'ã®3çªç®ã®åŒæ°ã調ã¹ãããšãæ€èšããŠãã ããã å€ãã2çªç®ã®åŒæ°ã§æž¡ãããæååã®é·ããšäžèŽããªãå¯èœæ§ããããŸãã asn1_gen.c 371
åé¡ã¯ããã«ãããŸãïŒ
if (!strncmp(vstart, "BITLIST", 3))
æååãBITLISTãã®é·ãã¯7æåã§ãã
å°ãæ°ãåãããã èªè ã¯ãPVS-Studioããã®ãããªãšã©ãŒãã©ã®ããã«èŠã€ããããå°ãããããããŸããã 説æããŸãã é¢æ°åŒã³åºãïŒãã®å Žåã¯strncmpïŒïŒïŒã«é¢ããæ å ±ãåéããããŒã¿ãããªãã¯ã¹ãäœæããŸãã
- vstartããASCIIãã5
- vstartããUTF8ãã4
- vstartããHEXãã3
- vstartããBITLISTãã3
ããŸãè¯ããªã
ãïŒ 08lXãã䜿çšããŠãã€ã³ã¿å€ãåºåããã®ã¯è¯ããããŸããã ããã«ã¯ãïŒ pãããããŸãã
typedef struct mem_st { void *addr; .... } MEM; static void print_leak_doall_arg(const MEM *m, MEM_LEAK *l) { .... BIO_snprintf(bufp, BUF_REMAIN, "number=%d, address=%08lX\n", m->num,(unsigned long)m->addr); .... }
ãã€ã³ã¿ãŒã¯é¢æ°ã«æž¡ãããŸããããåã®å€ïŒunsigned longïŒãæž¡ãããŸãã ãããã£ãŠãã³ã³ãã€ã©ãŒãšäžéšã®ã¢ãã©ã€ã¶ãŒã¯ãµã€ã¬ã³ãã®ãŸãŸã«ãªããŸãã
PVS-Studioã¯ãéæ¥çã«ãã®æ¬ é¥ã«æ°ä»ããŸããã 圌ã¯ããã€ã³ã¿ãŒãïŒç¬Šå·ãªãlongïŒåã«æ瀺çã«ãã£ã¹ãããããšããäºå®ãå«ããŸãã ããã¯ééã£ãŠããŸãã ãã€ã³ã¿ããlongãåã«åãŸãããšãä¿èšŒãã人ã¯ããŸããã ããšãã°ãããã¯Win64ã§ã¯å®è¡ã§ããŸããã
æ£ããçãã³ãŒãã¯æ¬¡ã®ãšããã§ãã
BIO_snprintf(bufp, BUF_REMAIN, "number=%d, address=%p\n", m->num, m->addr);
ãã€ã³ã¿ãŒå€ãæ£ããå°å·ãããªã3ã€ã®å ŽæããããŸãã
- mem_dbg.c 699
- bio_cb.c 78
- asn1_lib.c 467
ãããã«
éçã¢ãã©ã€ã¶ãŒã¯ãã®ãšã©ãŒãæ€åºãããéåžžã«é·ãæéç¶ããŸããããç§ã¯ãŸã 誰ããæ¥åžžæ¥åã§éçåæã䜿çšããããšããå§ãããŸãã ãã¹ãŠã®åé¡ã解決ããããã°ã©ã ã³ãŒãããšã©ãŒããå®å šã«ä¿åããç¹å¹è¬ãæ¢ãå¿ èŠã¯ãããŸããã æé©ãªçµæã¯ãåäœãã¹ãã éçããã³åçåæ ãååž°ãã¹ããªã©ã®çµ±åã¢ãããŒãã§éæãããŸãã éçåæã¯ãã³ãŒãã£ã³ã°æ®µéã§ã®å€ãã®ã¿ã€ããã¹ãæããªãšã©ãŒãæé€ããããã«ãããæ°ããæ©èœããã培åºçãªãã¹ãã®äœæãªã©ãä»ã®æçšãªãã®ã®æéãç¯çŽããŸãã
PVS-Studioã³ãŒãã¢ãã©ã€ã¶ãŒããè©Šããã ããã
ãã®èšäºã¯è±èªã§ãã
ãã®èšäºãè±èªåã®èŽè¡ãšå ±æãããå Žåã¯ã翻蚳ãžã®ãªã³ã¯ã䜿çšããŠãã ããïŒAndrey Karpovã OpenSSLãããžã§ã¯ãã®ãã§ãã¯ã«é¢ããéå±ãªèšäº ã
èšäºãèªãã§è³ªåããããŸããïŒ
å€ãã®å Žåãèšäºã«ã¯åã質åãå¯ããããŸãã ããã§ãããã«å¯ŸããåçãåéããŸããïŒ PVS-Studioããã³CppCatããŒãžã§ã³2014ã«é¢ããèšäºã®èªè
ããã®è³ªåãžã®åç ã ãªã¹ããã芧ãã ããã