ããã»ããµã§ãµããŒããããŠããããªããã£ãæŽæ°åã¯ãå®ç掻ã§ã®æäœã«äœ¿çšãããç¡éã®æŽæ°ã»ããã®éå®ãããè¿äŒŒå€ã§ãã ãã®å¶éããã衚çŸã¯ãäŸãã°255_u8 + 1 == 0ããã«ãåžžã«ãå®ãæ°ãšäžèŽãããšã¯éããŸããã å€ãã®å Žåãããã°ã©ãã¯ãã®éããå¿ããŠããŸããç°¡åã«ãã°ã«ã€ãªããå¯èœæ§ããããŸãã
Rustã¯ããã°ããä¿è·ããããšãç®çãšããããã°ã©ãã³ã°èšèªã§ãããæãæœè¡æ§ã®ããã¡ã¢ãªãšã©ãŒã®é²æ¢ã«çŠç¹ãåœãŠãŠããŸãããããã°ã©ããä»ã®åé¡ãåé¿ããããšããŠããŸãïŒ ã¡ã¢ãªãªãŒã¯ ã ãšã©ãŒãç¡èŠã ã æŽæ°ãªãŒããŒãã㌠ã
ãã³ã®ãªãŒããŒãããŒ
Rust Overflow Detection and Prevention Policyã¯ãæšå¹Žã®1.0.0ãªãªãŒã¹ã«åããŠäœåºŠã倿ŽãããŸããã ãã®çµæããªãŒããŒãããŒãã©ã®ããã«åŠçãããã©ã®ãããªçµæãçãããã«ã€ããŠèª€è§£ããããŸãã
ããŒãžã§ã³1.0.0-alphaããåã§ã¯ããªãŒããŒãããŒã¯åšæçã§ãããçµæã¯2ãžã®å ç®ã®äœ¿çšã«å¯Ÿå¿ããŠããŸããïŒã»ãšãã©ã®ææ°ã®ããã»ããµãŒãããã§ããããã«ïŒã ãã ãããã®è§£æ±ºçã¯æé©ã§ã¯ãããŸãããäºæããªããæ°ä»ããªããªãŒããŒãããŒã¯ãå€ãã®å Žåãšã©ãŒã«ã€ãªãããŸãã ããã¯ã笊å·ä»ãæŽæ°ã®ãªãŒããŒãããŒãæªå®çŸ©ã®åäœã§ãããã¡ã¢ãªã®æäœã«ãããã»ãã¥ãªãã£éåã«å¯Ÿããäžååãªä¿è·ãšäžç·ã«ãç°¡åã«æå·ã«ã€ãªããå¯èœæ§ããããããCããã³C ++ã§ç¹ã«æªãã§ãã ãã ããRustãªã©ã®ããã»ãã¥ãªãã£ãéèŠããèšèªã§ã¯ãããã§ãåé¡ãåŒãèµ·ãããŸãïŒãªãŒããŒãããŒã®å€ãã®äŸãããããããã¯ãããªã²ãŒã ïŒ çµæžåŠ ã å¥åº·ææšãªã©ïŒã ãã€ããªæ€çŽ¢ã®å®è£
ãããã«ã¯èªç©ºãœãããŠã§ã¢ã§ãèŠãããŸãã ç°¡åã«èšãã°ã max(x - y, z)ãããªã³ãŒãã¯å®æçã«çºçããæ°å€ã笊å·ãªãã§x - yããªãŒããŒãããŒãåŒãèµ·ããå Žåã誀ã£ãçµæãçæããå¯èœæ§ããããŸãã ãã®çµæãæŽæ°ã®ãªãŒããŒãããŒã«é¢ããŠRustãããå®å
šã«ããããšããèŠæããããŸããã
çŸåšã®ã¹ããŒã¿ã¹ã¯RFC 560ã§å®çŸ©ãããŠããŸã ã
- ãããã°ã¢ã»ã³ããªã§ã¯ãç®è¡æŒç®ïŒ
+ ã -ãªã©ïŒã®ãªãŒããŒãããŒããã§ãã¯ãããååšããå Žåã¯ãããã¯ãçºçããŸãã - ãã®ãªãªãŒã¹ã§ã¯ããªãŒããŒãããŒã®çµæã®ãã§ãã¯ã¯è¡ããããçµæã«ããåšææ§ãä¿èšŒãããŸãã
ãªãŒããŒãããŒãã§ãã¯ã¯ãã¢ã»ã³ããªã®çš®é¡ã«é¢ä¿ãªããã°ããŒãã«ã«ããŸãã¯åã
ã®æäœã®ã¬ãã«ã§ãæåã§ãªã³ãŸãã¯ãªãã«ã§ããŸãã
ãã ãã / 0ããã³MIN / -1 ïŒç¬Šå·ä»ãæŽæ°ã®å ŽåïŒããã³åæ§ã«%ãã§ãã¯ã«ã¯åœ±é¿ããŸããã ãããã®èšç®ã¯Cããã³LLVMã§ã®æªå®çŸ©ã®åäœã§ããããããrustcã®åäœã®çç±ã§ããããRustã¯çè«çã«MIN / -1ãéåžžã®ãªãŒããŒãããŒãšèŠãªãããã§ãã¯ãç¡å¹ã«ããŠMINãè¿ãããã§ãã
ãããã°ã¢ãŒãã§ã®ãã§ãã¯ã®ãããã§ãRustã³ãŒãã®ãªãŒããŒãããŒã«é¢é£ãããšã©ãŒãããæ©ãæ€åºãããããšãé¡ã£ãŠããŸãã ããã«ãå®éã«ãªãŒããŒãããŒãåœãŠã«ããå Žåã¯ãã³ãŒãã§ãããæç€ºçã«æå®ããå¿
èŠããããŸããããã«ãããå°æ¥ã®éçã¢ãã©ã€ã¶ãŒããã³ãã¹ãŠã®ã¢ãŒãã§ãªãŒããŒãããŒãã§ãã¯ãå«ãã³ãŒãã®èª€æ€ç¥ã®æ°ãæžããŸãã
ç¥è©±ïŒãªãŒããŒãããŒã®çµæã¯æªå®çŸ©ïŒæªå®çŸ©ïŒ
ãªãŒããŒãããŒã¯æªå®çŸ©ã®åäœãåŒãèµ·ããå¯èœæ§ããããŸãããRustã®éèŠãªç®æšã®1ã€ã¯ã¡ã¢ãªã»ãã¥ãªãã£ã確ä¿ããããšã§ããããã®ãããªäžç¢ºå®æ§ ïŒCã®æªå®çŸ©ã®åäœãšåæ§ïŒã¯æããã«ãã®ç®æšãšççŸããŸãã æªå®çŸ©ã®å€ãå«ã倿°ã¯ã䜿çšéã§åãå€ãç¶æããå¿
èŠã¯ãããŸããã
ã»ãã¥ãªãã£ããã®ãããªå€ã«äŸåããŠããå Žåãããã¯æ²æšãªçµæã«ã€ãªãããŸãã ããšãã°ã foo[x]é
åãç¯å²å€ã§ãããã©ããã確èªããå ŽåïŒ
let x = undefined;
x < foo.len()ãæ¯èŒãããšããšé
åã«çŽæ¥ã¢ã¯ã»ã¹ãããšãã«å€æ°å€ãç°ãªãå Žåãä¿èšŒã«éåããå¯èœæ§ããããŸãïŒæ¯èŒã¯0 < foo.len()ã«ãªãããšããããã€ã³ããã¯ã¹ã§ã¢ã¯ã»ã¹ãããšfoo.get_unchecked(123456789) æ··ä¹±ïŒ
ãããã£ãŠãCã®ç¬Šå·ä»ãæŽæ°ãšã¯ç°ãªããRustã§ã¯ããªãŒããŒãããŒãæªå®çŸ©ã«ããããšã¯ã§ããŸããã èšãæããã°ãã³ã³ãã€ã©ãŒã¯ãä»ã®æ¹æ³ã§èšŒæã§ããªãéãããªãŒããŒãããŒãçºçããå¯èœæ§ããããšæ³å®ããªããã°ãªããŸããã ããã¯éèªæãªçµæã䌎ããŸãx + 1 > xåžžã«çã§x + 1 > xãŸããããCã³ã³ãã€ã©ã¯ ã笊å·ä»ãæŽæ°ã®å Žåããã®æ¡ä»¶ãåžžã«æºãããããšä»®å®ããŸãã
ãããããããã©ãŒãã³ã¹ã¯ã©ãã§ããïŒã ç§ã¯ãã§ã«ãã®è³ªåãäºæ³ããŠããŸãã å®éãæªå®çŸ©ã®åäœã«ãããã³ã³ãã€ã©ãŒãä»®å®ãç«ãŠãããšãã§ãããããæé©åãç°¡çŽ åãããŸãã ãããã£ãŠããã®ãããªåäœãæåŠãããšãé床ã«åœ±é¿ããå ŽåããããŸãã æŽæ°ãªãŒããŒãããŒã®äžç¢ºå®æ§ã¯ãã«ãŒãã§èªå°å€æ°ãšããŠäœ¿çšãããããšãå€ããããCã§ç¹ã«åœ¹ç«ã¡ãŸãããã®ãããä»®å®ãç«ãŠãããšã«ãããã«ãŒãã®ååŸ©åæ°ãããæ£ç¢ºã«åæã§ããŸããfor for (int i = 0; i < n; i++)ãå®è¡ãããŸãnã¯è² ã®å€ãå«ãŸãªããšæ³å®ã§ããããã nåã Rustã¯ãã€ã³ããã¯ã¹ãšããŠæ£ã®æ°ã䜿çšããŠïŒ 0..nã¯åžžã«nã¹ããããäžããïŒ for x in some_array { ... }ããã«ã軜éå埩åãããŒã¿æ§é ãçŽæ¥ãã©ããŒã¹ã§ããããã«ããããšã§ããããã®åé¡ã®ã»ãšãã©ãåé¿ããŸãã ãããã®ã€ãã¬ãŒã¿ãŒã¯ããŠãŒã¶ãŒã«æªå®çŸ©ã®åäœãåŠçãããããšãªããããŒã¿æ§é ã®å
éšæ§é ã«é¢ããç¥èã䜿çšã§ããŸãã
ãŸããRustã¯Cãšã¯ç°ãªãã xã笊å·ä»ãæŽæ°ã®å Žåã x * 2 / 2åçŽã«xæžããããšã¯ã§ããŸããã ãã®æé©åã¯é©çšãããŸããïŒè€éãªç®è¡åŒã®ä»£ããã«æåã§xãèšè¿°ããå Žåãé€ããŸãïŒããç§ã®ç·Žç¿ã§ã¯ããã®ãããªåŒã¯ã³ã³ãã€ã«æã«xãããã£ãŠãããšãã«æãããèŠãããŸããã€ãŸããåŒå
šäœã宿°ã«çœ®ãæããããŸãã
ç¥è©±ïŒãªãŒããŒãããŒã®çµæã¯äžå®ã§ãã
ãªãŒããŒãããŒã®çµæã¯äžå®ã§ããå¯èœæ§ããããŸãããã®å Žåãã³ã³ãã€ã©ã¯ãããèµ·ããå¯èœæ§ããããšæ³å®ããªããã°ãªããŸããããçµæãšããŠå€ãè¿ãïŒãŸãã¯ãŸã£ããè¿ããªãïŒæš©å©ãæã£ãŠããŸãã å®éãæŽæ°ãªãŒããŒãããŒããã§ãã¯ããRFC 560ã® æåã®ããŒãžã§ã³ã¯æ¬¡ã®ããšã瀺åããŠããŸãã
ãªãŒããŒãããŒããã§ãã¯ããããã©ããã«å¿ããŠãæªæå®ã®å€ãè¿ãããã«åäœã倿Žãããããããã¯ãåŒãèµ·ãããŸãã
[...]
- çè«çã«ã¯ãå®è£
ã¯æªæå®ã®å€ãè¿ããŸãã ãã ããå®éã«ã¯ãçµæã¯åŸªç°ãªãŒããŒãããŒã«äŒŒãŠããŸãã å®è£
ã§ã¯ããšã©ãŒãåŒãèµ·ãããªãããã«ãé床ã®äºæž¬äžèœæ§ãšäºæããªãåäœãé¿ããå¿
èŠããããŸãã
- ãããŠæãéèŠãªããšïŒããã¯Cã®çè§£ã«ãããäžå®ã®æ¯ãèãã§ã¯ãããŸãããæäœã®çµæã¯æä»çã«æå®ããããCã®ãããªããã°ã©ã å
šäœã®æ¯ãèãã§ã¯ãããŸãããããã°ã©ããŒã¯ãªãŒããŒãããŒäžã«ç¹å®ã®å€ã«äŸåããããšã¯ã§ããŸããããã³ã³ãã€ã©ãŒã¯æé©åã®ããã«ããã®ãªãŒããŒãããŒã¯çºçããŸããã
RFCãšãæå®ãããŠããªãããªãŒããŒãããŒã®çµæïŒã€ãŸãã 127_i8 + 1ã¯-128ãŸãã¯0ãŸãã¯127ãŸãã¯ãã®ä»ã®å€ãè¿ãããšãã§ããŸãïŒãããã®å€åã«ã€ãªããæŽ»çºãªè°è«ã®å¯Ÿè±¡ãšãªããŸããã
å人ã®åªåã®ãããã§ãRFCã¯ææ°ã®å€èгã«ãªããŸããïŒãªãŒããŒãããŒã®çµæãšããŠãå€ããŸã£ããè¿ãããªãïŒããšãã°ããããã¯ãçºçããïŒãã2ã®å ç®ã®äœ¿çšã«å¯Ÿå¿ããåšæçãªçµæãè¿ãããŸãã ä»ãæèšã¯æ¬¡ã®ããã«ãªããŸãã
æäœ+ã-ã*ã¯ããªãŒããŒãããŒãŸãã¯é åºã®æ¶å€±ïŒã¢ã³ããŒãããŒïŒã«ã€ãªããå¯èœæ§ããããŸãã ãã§ãã¯ããªã³ã«ãããšããããã¯ãçºçããŸãã ãã以å€ã®å Žåãçµæã¯åŸªç°ãªãŒããŒãããŒã«ãªããŸãã
èšé²ããããªãŒããŒãããŒã®çµæã¯ä¿è·å¯Ÿçã§ãããªãŒããŒãããŒãæ€åºãããªããŠãããšã©ãŒã¯çµæã«åœ±é¿ããŸããã åŒx - y + z (x - y) + zãšããŠèšç®ããããããæžç®ã«ãã£ãŠãªãŒããŒãããŒãçºçããå¯èœæ§ããããŸãïŒããšãã°ã x = 0ããã³y = 1 ãäž¡æ¹ãšã笊å·ãªãïŒãã zãååã«å€§ããå ŽåïŒãã®äŸã§ã¯z >= 1 ïŒãçµæã¯ãçŸå®äžçã®æ°åãã䜿çšããå Žåãšåæ§ã«ãªããŸãã
倿Žã¯160ã³ã¡ã³ãã®è°è«ã®çµããã«è¿ã¥ããã®ã§ãç°¡åã«ã¹ãããã§ããŸããããã®ããã人ã
ã¯ãªãŒããŒãããŒã®çµæãäžç¹å®ã§ãããšèãç¶ããããšãã§ããŸãã
ç¥è©±ïŒããã°ã©ããŒã¯ãªãŒããŒãããŒåŠçãå¶åŸ¡ã§ããªã
ãªãŒããŒãããŒãã§ãã¯ã®å°å
¥ã«å¯Ÿããè°è«ã®1ã€ã¯ãããã·ã¥èšç®ã¢ã«ãŽãªãºã ãäžéšã®ããŒã¿æ§é ïŒãªã³ã°ãããã¡ãŒãªã©ïŒãããã«ã¯ã³ãŒããã¯ãªã©ãåšæçãªãªãŒããŒãããŒã«äŸåããããã°ã©ã ãšã¢ã«ãŽãªãºã ã®ååšã§ããã ãããã®ã¢ã«ãŽãªãºã ã®å Žåããããã°ã¢ãŒãã§+ã䜿çšãããšæ£ãããªããªããŸãããããã¯ãçºçããŸããããã®ãããªãªãŒããŒãããŒã¯æèãããŠããŸããã ããã«ãå Žåã«ãã£ãŠã¯ããããã°ãã«ãã ãã§ãªããã§ãã¯ãå«ããããšãã§ããŸãã
RFCããã³æšæºã©ã€ãã©ãªã¯ãéåžžã®æŒç®åã«å ããŠã 4ã€ã®ã¡ãœããã»ãããæäŸããŸãã
ããã¯ãã¹ãŠã®ãç¹æ®ãªã±ãŒã¹ããã«ããŒããã¯ãã§ãïŒ
wrapping_...ã¯ãããã£ã³ã°ã®çµæã2ã«æ»ããŸããsaturating_... ããªãŒããŒãããŒãçºçãããšãã«æé«å€/æäœå€ãè¿ããŸããoverflowing_...ã¯ããªãŒããŒãããŒãçºçããããšã瀺ãããŒã«å€ãšãšãã«2ã«å ç®ããçµæãè¿ããŸããchecked_...ã¯ããªãŒããŒãããŒã®å Žåã«å€NoneãåãOptionãè¿ãchecked_... ã
ãããã®æäœã¯ãã¹ãŠã overflowing_...芳ç¹ããå®è£
ã§ããŸãããæšæºã©ã€ãã©ãªã¯ãæãé »ç¹ã«çºçããåé¡ã®è§£æ±ºãç°¡çŽ åããããšããŸãã
æ¬åœã«åŸªç°ãªãŒããŒãããŒã䜿çšãããå Žåã¯ã x.wrapping_sub(y).wrapping_add(z)ããã«x.wrapping_sub(y).wrapping_add(z)ã§ããŸãã ããã«ãããæåŸ
ã©ããã®çµæãåŸãããæšæºã®Wrappingã©ã€ãã©ãªã®åã䜿çšããããšã«ãããåé·æ§ãæžããããšãã§ããŸãã
ããã¯æçµç¶æ
ã§ã¯ãªãå¯èœæ§ããããŸããRFCã§ã¯ã æ¹åã®å¯èœæ§ã«ã€ããŠãèšåããŠããŸãã å°æ¥çã«ã¯ãSwiftã®Cyclic &+ãªã©ã®æŒç®åãRustã«è¿œå ãããå¯èœæ§ããããŸãã Rustã¯ä¿å®çã§ãåççãªç¯å²ã§æå°éã«æããããšããŠããããããªãŒããŒãããŒãã§ãã¯ãç¡å¹ã«ããå¯èœæ§ããããããããã¯ããã«ã¯è¡ãããŸããã§ããïŒããšãã°ãå¥ã®é¢æ°ãæç€ºçã«ããŒã¯ããããã¹ãŠã®ã¢ãŒãã§ã³ãŒãã«ãã§ãã¯ããããŸããïŒ ã ç¹ã«ã ServoãšGeckoã®æãã¢ã¯ãã£ããªïŒæœåšçãªïŒãŠãŒã¶ãŒã¯åŸè
ã«èå³ããããŸãã
ãã¹ãŠã®ã³ãŒãã§ãªãŒããŒãããŒãã§ãã¯ãå¿
èŠãªå Žåã¯ã checked_addãã¹ãŠã®å Žæã§äœ¿çšãããïŒããŸã䟿å©ã§ã¯ãããŸããïŒïŒãæç€ºçã«æå¹ã«ããå¿
èŠããããŸãã ããã©ã«ãã§ã¯ãããã°ã¢ãŒãã§ã®ã¿åäœããŸããã-c -C debug-assertions=on rustcãïŒRustã³ã³ãã€ã©ãŒã«ïŒæž¡ããããŸãã¯è²šç©ãããã¡ã€ã«ã® debug-assertionsãã£ãŒã«ããèšå®ããããšã§ããªãŒããŒãããŒãã§ãã¯ãæå¹ã«ã§ããŸã ã ãŸããå¯èœã§ããã°ãä»ã®ãããã°ãã§ãã¯ãšã¯å¥ã«ããããæå¹ã«ããäœæ¥ãé²è¡äžã§ãïŒçŸåšãrustcã¯äžå®å®ãªãªãã·ã§ã³-Z force-overflow-checks flagãµããŒãããŠããŸãïŒã
ç¥è©±ïŒãªãŒããŒãããŒãã§ãã¯ã«éžæããã¢ãããŒãã¯ãã³ãŒãã®é床ãäœäžãããŸãã
Rustã¯ãå¯èœãªéãé«éã§ããããšãç®æããŠããããªãŒããŒãããŒãã§ãã¯ãèšèšããéã«ãããã©ãŒãã³ã¹ã®åé¡ãéåžžã«æ·±å»ã«æ±ãããŸããã ããã©ãŒãã³ã¹ã¯ããªãªãŒã¹ãã«ãã®ãã§ãã¯ãããã©ã«ãã§ç¡å¹ã«ãªã£ãäž»ãªçç±ã®1ã€ã§ãã ãã¡ãããããã¯ãéçºäžã«ãšã©ãŒãæ€åºããå©äŸ¿æ§ã®ããã«é床ãç ç²ã«ãããªãã£ãããšãæå³ããŸãã
æ®å¿µãªããããªãŒããŒãããŒãã§ãã¯ã«ã¯ããã«å€ãã®ã³ãŒããšåœä»€ãå¿
èŠã§ãã
[no_mangle] pub fn unchecked(x: i32, y: i32) -> i32 { x.wrapping_add(y) } #[no_mangle] pub fn checked(x: i32, y: i32) -> i32 { x + y }
-O -Z force-overflow-checks ãx86ã§-O -Z force-overflow-checks ïŒ32ãããARM LLVMã§ã¯çŸåšãåé·ãªæ¯èŒãšã¬ãžã¹ã¿æäœãçæããããããããã©ãŒãã³ã¹ã®äœäžã¯ããã«å€§ãããªããŸãïŒïŒ ïŒ
unchecked: leal (%rdi,%rsi), %eax retq checked: pushq %rax addl %esi, %edi jo .overflow_occurred movl %edi, %eax popq %rcx retq .overflow_occurred: leaq panic_loc2994(%rip), %rdi callq _ZN9panicking5panic20h4265c0105caa1121SaME@PLT
checkedåã蟌ãŸããŠãããšããæ¡ä»¶ã§ïŒå¿
èŠãªå ŽåïŒãå¿
èŠä»¥äžã®åœä»€ãããchecked ããã®å Žåã pushq / pop / movlã䜿çšããŠã¬ãžã¹ã¿ãpushqå¿
èŠmovlãŸããã åã蟌ã¿ããªããŠãã pushq / popqã«ããã¹ã¿ãã¯ç®¡çã¯å¿
èŠãªããšpushqãŸãããæ®å¿µãªãããRustã¯LLVMããŒãžã§ã³ã䜿çšããŸãããããã«ã¯ãšã©ãŒãå«ãŸããŠããŸã ã ãã¡ããã lea代ããã«addã䜿çšaddå¿
èŠãããã®ã§ããããã®è¿œå ã®æç€ºã¯ãã¹ãŠé¢åã§ãã
x86ã§ã¯ãç®è¡æŒç®ã«lea ïŒããŒãå®å¹ã¢ãã¬ã¹ïŒã䜿çšãããšéåžžã«äŸ¿å©ã§ããæ¯èŒçè€éãªèšç®ãå®è¡ã§ããååãšããŠãåœä»€ã¬ãã«ã§ã®ããé«ãäžŠåæ§ã«å¯äžããaddãšã¯å¯Ÿç
§çã«ãCPUãšãã®ãã€ãã©ã€ã³ã®å¥åã®éšåã§èšç®ãããŸãã x86 ISAã§ã¯ããã€ã³ã¿ãŒã䜿çšããè€éãªèšç®ã®çµæãéåç
§ã§ããŸããäžè¬åœ¢åŒã¯A(r1, r2, B) ïŒATïŒTæ§æã§ïŒã§ããããã¯r1 + B * r2 + Aãšåçã§ãã éåžžãããã¯movãªã©ã®ã¡ã¢ãªåœä»€ã§çŽæ¥äœ¿çšãããŸãïŒããšãã°ã let y = array_of_u32[x]; mov (array_of_u32.as_ptr(), x, 4), y ãåèŠçŽ ã®ãµã€ãºã¯4ïŒã§ããã lea䜿çšãããšãã¡ã¢ãªã«åœ±é¿ãäžããã«ç®è¡ãå®è¡ã§ããŸãã äžè¬çã«ãæŒç®ã«leaã䜿çšããæ©èœã¯éåžžã«äŸ¿å©ã§ãã æ¬ ç¹ã¯ã leaããªãŒããŒãããŒãã§ãã¯ãšçŽæ¥çµ±åãããªãããšã§ããããã瀺ãããã«ããã»ããµã¹ããŒã¿ã¹ãã©ã°ãèšå®ããŸããã
ãã ããããã©ãŒãã³ã¹ã«å¯Ÿããããã«å€§ããªææã¯ããªãŒããŒãããŒãã§ãã¯ãä»ã®æé©åã劚ããããšã§ãã æåã«ããã§ãã¯èªäœãã³ãŒããäžŠã¹æ¿ããŸãïŒå±éãäžŠã¹æ¿ããã«ãŒããã¯ãã«åãªã©ãé²ããŸãïŒã 第äºã«ãã¹ã¿ãã¯ã®ãããã¯ãšå·»ãæ»ãã«ãããã³ã³ãã€ã©ã¯ããä¿å®çã«ãªããŸãã
ãããã®èæ
®äºé
ã¯ãã¹ãŠãå¯èœãªéãæé«ã®ããã©ãŒãã³ã¹ãéåžžéèŠãªãªãªãŒã¹ãã«ãã«ãªãŒããŒãããŒãã§ãã¯ãå«ãŸããªãçç±ã説æããŠããŸãã
ãã®å ŽåããªãªãŒã¹ã¢ãŒãã§ãªãŒããŒãããŒãã§ãã¯ãæå¹ã«ãªã£ãŠããŠããç¯å²å€ã®ã¢ã¬ã€ã®ãã§ãã¯ã®å Žåãšåæ§ã«ãããã©ãŒãã³ã¹ã®æå€±ãæžããããšãã§ããŸãã äžæ¹ã§ã¯ãã³ã³ãã€ã©ãŒã¯ç¯å²åæãå®è¡ããåã
ã®æäœããªãŒããŒãããŒãåŒãèµ·ãããªãããšã蚌æã§ããŸãã å®é ããã®ãããã¯ã«ã¯ å€ã㮠泚æ ãæãããŠããŸãã äžæ¹ããããã¯ã®äœ¿çšã«ãã£ãŠåŒãèµ·ããããåé¡ã¯ããµããžã§ã¯ãé åãèš±å¯ããå Žåã ããã°ã©ã ã®ç°åžžçµäºã§ãããã¯ã眮ãæããããšã«ãã£ãŠéšåçã«è§£æ±ºã§ããŸãã
RFCãªãŒããŒãããŒã¯ã远å ã®æé©åã®å¯èœæ§ãæäŸããŸããã é
å»¶ããã㯠ããèš±å¯ãããŸããã€ãŸããåèšç®ããã§ãã¯ãã代ããã«ãããããã®èšç®ããªãŒããŒãããŒã«ã€ãªããå Žåãå®è£
ã¯a + b + c + dæäœãå®è¡ãa + b + c + dæåŸã«äžåºŠãããã¯ããããšãã§ããŸãåå¥ã®æäœtmp = a + b ãæ¬¡ã«tmp + cãªã©ã çŸæç¹ã§ã¯å®è£
ãããŠããŸãããããã®ãããªæ©äŒããããŸãã
ç¥è©±ïŒãã§ãã¯ã¯ãšã©ãŒãæ€åºããªã
æŽæ°ãªãŒããŒãããŒãåŠçããããã®ãã®ã¹ããŒã ãéçºãè°è«ãããã³å®è£
ãããã¹ãŠã®åªåã¯ãå®éã«ãšã©ãŒãæ€åºããå©ãã«ãªããªããã°ç¡é§ã«ãªããŸãã å人çã«ã¯ãç¹ã«ã¯ã€ãã¯ãã§ãã¯ãªã©ã®ãã¹ãã€ã³ãã©ã¹ãã©ã¯ãã£ãšã®çµã¿åããã§ãæžã蟌ã¿çŽåŸã«cmp::max(x - y, z) ïŒã€ã³ã¿ãŒãããã«ãããããªãã£ãããããªã³ã¯ã¯ãããŸããïŒã®ãããªåŒã§ããã€ãã®åé¡ãçºèŠããŸããã
ãªãŒããŒãããŒãã§ãã¯ã«ãããããšãã°æ¬¡ã®ãããªãšã³ã·ã¹ãã ã®ãšã©ãŒãæ€åºãããŸããïŒãªã¹ãã¯å®å
šã§ã¯ãããŸããïŒïŒã
Rust以å€ã«ãããªãŒããŒãããŒãšã©ãŒã®å±éºæ§ã®ä»ã®å€ãã®äŸããããŸãã 2011幎ã«ã圌ãã¯25ã®æãäžè¬çãªCWE / SANSãšã©ãŒã®ãªã¹ããäœæããŸããã Swiftãªã©ã®äžéšã®èšèªã¯åžžã«ãªãŒããŒãããŒãã§ãã¯ãå®è¡ããŸãããPython 3ãHaskellãªã©ã®ä»ã®èšèªã§ã¯ãããã©ã«ãã§ä»»æã®ç²ŸåºŠã®æ°å€ã䜿çšããŠãªãŒããŒãããŒãåé¿ããŸãã ããã«ãäžéšã®Cã³ã³ãã€ã©ã¯ãæªå®çŸ©ã®åäœã埪ç°ãªãŒããŒãããŒã«çœ®ãæãããªãã·ã§ã³ïŒ -fwrapv ïŒããµããŒããããªãŒããŒãããŒã®æ€åºã«åœ¹ç«ã¡ãŸãïŒ -fsanitize=signed-integer-overflow ïŒã