ããã»ããµã§ãµããŒããããŠããããªããã£ãæŽæ°åã¯ãå®ç掻ã§ã®æäœã«äœ¿çšãããç¡éã®æŽæ°ã»ããã®éå®ãããè¿äŒŒå€ã§ãã ãã®å¶éããã衚çŸã¯ãäŸãã°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
ïŒã