Ò»³¡¿´ËƼòÆÓµÄ³ÌÐòÍ»·¢¡°±¬Õ¨¡±¡ª¡ªc++2712ICEµÄÉñÃØÃæÉ´
ÔÚÈí¼þ¿ª·¢µÄÌìÏÂÀC++ÒÔÆä¼«¸ßµÄÐÔÄܺÍÎÞаÐÔÊÜÖÚÖڶ࣬µ«Óë´ËÒ²´øÀ´Á˲»ÉÙÍ·ÌÛµÄÎÊÌâ¡£ÓÈÆäÊÇÔÚ±àÒë½×¶Î£¬ÎÞÒâ»áÓöµ½Ò»Ð©¡°ÄªÃûÆäÃµÄ¹ýʧ£¬ÆäÖС°ÄÚ²¿±àÒë¹ýʧ£¨ICE£©¡±ÓÈÆäÁîÈË×¥¿ñ¡£½ñÌ죬ÎÒÃǾÍÒÔÒ»¸öÕæÊµµÄ°¸ÀýΪÆðµã£¬ÉîÈë̽ÌÖ¡°claude.simon-c++2712£ºICEonarelativelysimpleinstruction.¡±±³ºóµÄÉñÃØ¡£
ÄãÊÇ·ñÔøÓöµ½¹ýÕâÑùµÄÎÊÌ⣺дһ¶Î¼òÆÓµÄ´úÂ룬°´Àí˵ûÓÐÈκÎÖØ´ó²Ù×÷£¬È´ÔÚ±àÒëʱͻȻ±¨´í£º¡°ICEonarelativelysimpleinstruction¡±¡£ÕâÊÇÒ»¸öÁîÈ˾ÚÉ¥µÄ״̬£¬ÓÉÓÚÄãµÄ´úÂëÏÖʵÉϺܻù´¡£¬È´±»ÎÞÇéµÄ±àÒëÆ÷¡°ÈÓ¡±³öÒ»¸öÒì³£¡£
ÕâÀà¹ýʧµÄ½¹µã£¬ÍùÍù²¢²»ÔÚ´úÂë×Ô¼º£¬¶øÊÇÔÚ±àÒëÆ÷µÄ¡°ÄÚ²¿Âß¼¡±ÖÐÒþ²ØµÄDZÔÚȱÏÝ»òÏÞÖÆ¡£
Ϊʲô»á·ºÆðÕâÑùµÄÕ÷ÏóÄØ£¿×Åʵ£¬C++±àÒëÆ÷£¨ÓÈÆäÊÇGCC¡¢ClangµÈ£©ÊǼ«ÆäÖØ´óÇÒÖØ´óµÄϵͳ£¬ÄÚ²¿ÊµÏÖµÄijЩÓÅ»¯»òÌØ¶¨µÄÓïÑÔÌØÕ÷¿ÉÄÜÔÚÌØ¶¨Ìõ¼þÏÂÒý·¢¡°ËÀ»ú¡±¡£ÔÚÕâ¸ö°¸ÀýÖУ¬¡°simpleinstruction¡±Òâζ×Å´úÂëÖÐÖ»ÓÃÁ˼òÆÓµÄ²Ù×÷£¬ºÃ±È±äÁ¿¸³Öµ¡¢Í¨Ë׺¯ÊýŲÓõȣ¬°´Àí˵Ӧ¸Ã˳Ëì±àÒ룬µ«Ð§¹ûÈ´Óöµ½ÄÚ²¿¹ýʧ¡£
ÕâÖÖÇéÐΣ¬Åú×¢±àÒëÆ÷ÔÚ´¦Öóͷ£Ä³¸öÌØ¶¨µÄÖ¸Áî»òÓïÒåʱ£¬·ºÆðÁËδ·â¶ÂµÄ½çÏßÎÊÌâ¡£
ICE£¨InternalCompilerError£©¿ÉÒÔÃ÷ȷΪ¡°±àÒëÆ÷ÄÚ²¿µÄÍ߽⡱£¬¾ÍÏñÈí¼þÖеÄÀ¶ÆÁËÀ»ú£¨BSOD£©£¬²»¹ýËüÊÇÔÚ±àÒë½×¶Î·ºÆðµÄ¡£ËüÒâζ×űàÒëÆ÷ÔÚ´¦Öóͷ£ÄãµÄÔ´´úÂëʱ£¬Óöµ½ËüÎÞ·¨´¦Öóͷ£»òÕßÂß¼¹ýʧµÄ³¡¾°£¬Ö±½ÓÍ߽ⷴÏì¸øÓû§¡£
¹ØÓÚ¿ª·¢ÕßÀ´Ëµ£¬Óöµ½ICE£¬Òâζ×ÅÐèÒªÔÚ¡°ÔõÑùÈñàÒëÆ÷»Ö¸´Õý³£¡±Óë¡°¿ÉÄܱ³ºóÒþ²ØµÄ´úÂëȱÏÝ»òÓÅ»¯ÎÊÌ⡱֮¼äÕÒµ½Æ½ºâ¡£ÕâÒ²´øÀ´ÁËÒ»¸ö¼«¾ßÌôÕ½ÐÔµÄʹÃü£º¼ÈÒªÐÞ¸´ºÍ¹æ±ÜÕâÐ©Ï£ÆæµÄ±àÒë¹ýʧ£¬ÓÖҪȷ±£´úÂë×Ô¼ºµÄ׼ȷÐÔºÍЧÂÊ¡£
ÏÖʵÉÏ£¬Ðí¶àµ¼ÖÂICEµÄȪԴ£¬À´×ÔÓÚ±àÒëÆ÷µÄ¡°ÓÅ»¯Õ½ÂÔ¡±¡£±àÒëÆ÷ÔÚ°ÑÔ´Âëת»»ÎªÄ¿µÄ´úÂëʱ£¬»á¾ÙÐÐһϵÁÐÖØ´óµÄ±ä»»¡¢ÓÅ»¯£¬ÓÐʱΪÁË×·ÇóËÙÂÊ»ò¿Õ¼äµÄ×î´ó»¯£¬¾Í»áʹÓÃһЩ¸ß¼¶µÄÊýѧËã·¨»òÍÆ²âÀ´¼ò»¯ÊÂÇé¡£ÕâЩÓÅ»¯ËäºÃ£¬µ«Ò²¿ÉÄÜÔÚÌØ¶¨Ìõ¼þÏÂÒý·¢¡°½çÏß¡±ÎÊÌâ¡£
ÔÚÕâ¸ö°¸ÀýÖУ¬¡°relativelysimpleinstruction¡±¿ÉÄÜÌåÏÖ×ÅijÖÖͨÀý²Ù×÷£¬ºÃ±È£º±äÁ¿ÉùÃ÷Ó븳ֵ¡¢»ù´¡µÄÌõ¼þÅжϣ¬ÉõÖÁijЩģ°å´úÂë¡£ÔÚÕâЩÍâò¿´ËÆÎÞº¦µÄ²Ù×÷ÖУ¬¿ÉÄܰüÀ¨ÁËÐþÃîµÄ¡°½çÏß¡±£¬ºÃ±Èδ½ç˵ÐÐΪ¡¢Çå¾²ÐÔ½çÏß¡¢¼«¶ËµÄÀàÐÍת»»»òÕßÖØ´óµÄÄ£°åʵÀý»¯¡£
µ±Ä³¸öÓÅ»¯Õ½ÂÔʵÑé´¦Öóͷ£ÕâÑùµÄÖ¸Áîʱ£¬È´Î´ÄÜ׼ȷÖÎÀíÕâЩ½çÏߣ¬½ø¶øµ¼Ö¡°ËÀ»ú¡±¡ª¡ª¼ò³ÆICE¡£Õâ¾ÍÏñÒ»³¡¿´ËÆÑ°³£µÄ½»Í¨Ê¹ʣ¬±³ºóÒþ²Ø×Åõè¾¶Éè¼ÆµÄÎó²î»òÕß½»Í¨¹æÔòµÄºöÊÓ¡£
ÈôÊǾ³£Óöµ½ÀàËÆÎÊÌ⣬µÚÒ»²½ÊÇÉî¿ÌÃ÷È·×Ô¼ºµÄ´úÂë½á¹¹£¬¿´¿´ÊÇ·ñ±£´æÖîÈ磺δ½ç˵ÐÐΪ¡¢ÀàÐͲ»Æ¥Å䡢̫¹ýÖØ´óµÄÄ£°åʹÓõȡ£¼á³Ö±àÒëÆ÷¸üУ¬Ðí¶àICEÊÇÒÑÖªµÄbug£¬¿ª·¢ÕßÐû²¼Ð°汾ºó»áÐÞ²¹ÕâЩÎÊÌâ¡£
ʵÑé½ÓÄɲî±ðµÄ±àÒë²ÎÊý»ò¼ò»¯´úÂë½á¹¹£¬Ò²ÐíÄÜ×ÊÖú¶¨Î»ÎÊÌâ¡£ÀýÈ磬½ûÓÃijЩÓÅ»¯Õ½ÂÔ£¨-O0»òÌØ¶¨µÄÓÅ»¯Ñ¡Ï£¬»òÕßÖð²½Ñ¹Ëõ/ÖØ´ó»¯´úÂ룬ȷÈÏÊÇÄÄÒ»²¿·Ö´¥·¢ÁËICE¡£
¼Çס£º×·¸ùËÝÔ´£¬ÎÞ·ÁÊ¢´óÍÆ¼ö¡°±àÒëÆ÷µÄµ÷ÊÔÐÅÏ¢¡±¡ª¡ª°üÀ¨ÏêϸµÄ¹ýʧ¿ÍÕ»¡¢ÖÒÑÔÐÅÏ¢£¬ÉõÖÁ¿ÉÒÔͨ¹ý±àÒëÆ÷µÄµ÷ÊÔ²ÎÊý£¬Ì½Ë÷³öÏêϸ´¥·¢µã£¬´Ó¶øÏòÉçÇø»òά»¤Õß·´Ïì¡£
ÕâÖ»ÊÇICE±³ºóÖØ´óÉú̬µÄ±ùɽһ½Ç¡£ÈÃÎÒÃÇ´Óʵ¼ù½Ç¶È³ö·¢£¬¿´¿´ÔõÑùÓÅ»¯´úÂëÒԱܿªÕâЩ¡°À×Çø¡±£¬ÒÔ¼°ÃæÁÙ²»ÐÒÓöµ½µÄICEʱµÄÓ¦¼±Õ½ÂÔ¡£
¾ÓÉÉÏÃæµÄÆÊÎö£¬¸÷ÈËÒѾ¶Ô¡°¹É·ÝICE¡±±³ºóµÄÖØ´ó»úÖÆÓÐËùÏàʶ¡£ÎÒÃÇÏêϸ̽ÌÖÔÚ±àÂëʵ¼ùÖУ¬ÔõÑùÌáǰ¹æ±ÜºÍÐÞ¸´ÄÇЩ¿ÉÄÜÒý·¢ÄÚ²¿±àÒë¹ýʧµÄ³¡¾°¡£
Ðí¶àICEÎÊÌâ¶¼Ô´ÓÚÄ£°åµÄÀÄÓûòÖØ´ó»¯¡£ÓÈÆäÊÇÔÚÄ£°åÔª±à³ÌºÍSFINAE¼¼ÇÉÖУ¬Ò»µ©½ç˵±äµÃ¹ýÓÚÖØ´ó£¬±àÒëÆ÷¾ÍÈÝÒ׿¨ËÀ»òÍ߽⡣×÷Ϊ¿ª·¢Õߣ¬¿ÉÒÔʵÑ飺
Ö§½âÖØ´óµÄÄ£°å½ç˵£¬½«´óÄ£°å²ð½âΪ¶à¸ö¼òÆÓÄ£°å£»×èÖ¹ÉîÌõÀíµÄÄ£°åǶÌ×£¬¼á³Ö½á¹¹±âƽ£»Ê¹Óþ²Ì¬¶ÏÑÔ£¨static_assert£©Ìáǰ¼ì²âDZÔÚµÄÎÊÌâ¡£×èֹʹÓÃδ½ç˵ÐÐΪ
C++ÖÐδ½ç˵ÐÐΪ£¨UB£©ÊÇÒý·¢ICEµÄDZÔÚµ¼»ðË÷¡£ÀýÈ磬Խ½ç»á¼û¡¢Î´³õʼ»¯±äÁ¿¡¢¶àÖØÀàÐÍת»»µÈ¶¼¿ÉÄÜÔÚÓÅ»¯½×¶ÎÓÕ·¢ÄÚ²¿¹ýʧ¡£
°´ÆÚʹÓþ²Ì¬ÆÊÎö¹¤¾ß£¨ÈçClangStaticAnalyzer¡¢Coverity£©À´¼ì²âDZÔÚÎÊÌ⣻±àдÇкϱê×¼µÄ´úÂ룬×èÖ¹ÒÀÀµ±àÒëÆ÷µÄ¡°Ææ¼¼ÒùÇÉ¡±¡£µ÷½â±àÒë²ÎÊý£¬Ê¹Óòî±ðµÄÓÅ»¯Õ½ÂÔɨ³ýBug
ijЩÓÅ»¯Ñ¡ÏÈç-O3¡¢-ffast-math£©¿ÉÄÜÔöÌíÔâÓöICEµÄΣº¦¡£¿ÉÒÔʵÑ飺
ÏÈÓÃ-O0»ò-O1±àÒë¾ÙÐвâÊÔ£»Ö𲽿ªÆôÓÅ»¯£¬ÊÓ²ìÄÄÒ»Ïî´¥·¢¹ýʧ£»Ê¹ÓòÎÊýÈç¡°--no-inline¡±ÏÞÖÆ±àÒëÆ÷µÄijЩÐÐΪ¡£¸üбàÒëÆ÷°æ±¾£¬½èÖú×îеÄÐÞ²¹ºÍË¢ÐÂ
´ó²¿·ÖICEÎÊÌâÔÚа汾Öж¼»ñµÃÏàʶ¾ö¡£È·±£ÄãµÄ¿ª·¢ÇéÐÎʹÓÃ×îеĹٷ½Îȹ̰棬²¢¹Ø×¢Ïà¹ØµÄbugÌá½»ºÍÐÞ¸´ËµÃ÷¡£
½«´úÂëÖð½¥¼ò»¯£¬Ö±ÖÁÕÒµ½´¥·¢µã¡£Ê¹Óá°¶þ·Ö·¨¡±Õ½ÂÔ£¬Öð´Îɾ³ý»ò×¢ÊÍ´úÂëÆ¬¶Ï£¬ÊÓ²ì¹ýʧÊÇ·ñÏûÊÅ¡£
¸´ÖƳö×î¼ò¿É¸´ÏֵĴúÂëÆ¬¶Ï£»ÔÚ²î±ðµÄ±àÒëÇéÐÎÊÔÑ飬ÒÔÈ·ÈÏÊÇ´úÂëÎÊÌâÕÕ¾ÉÌØ¶¨ÇéÐÎbug£»ËÑË÷ÀàËÆµÄbug±¨¸æºÍÉçÇøÌÖÂÛ£¬ÊÇ·ñÒÑÓÐÔÝʱ½â¾ö¼Æ»®£»ÈôÊÇÈ·ÈÏÊDZàÒëÆ÷Bug£¬¿ÉÒÔÏòÏà¹ØÎ¬»¤ÕßÌá½»ÏêϸµÄ±¨¸æ£¬ÆÚ´ýδÀ´µÄÐÞ¸´¡£
ÃæÁÙ¡°¼òÆÓÖ¸ÁÒý·¢µÄICE£¬²»¿É¼òÆÓµØÒÔΪ¡°´úÂë²»ÖØ´ó¡±¾Í²»»áÍÉ»¯¡£ÕâÏÖʵÉϳÉΪһÖÖ¶Ô×Ô¼º±àÂëϰ¹ßµÄÌôÕ½¡ª¡ªÔÚ¿´ËƼòÆÓÖÐÕÒµ½Ç±ÔÚµÄÖØ´ó¡¢ÔÚ¡°½çÏß¡±ÖÐѧϰµ½ÔõÑùд³öÔ½·¢½áʵµÄ´úÂë¡£
Õâ¸öÎÊÌâÌáÐÑÎÒÃÇ£¬ÈκÎÉæ¼°µ×²ãµ×ÏߺÍÓÅ»¯µÄ»·½Ú¶¼¿ÉÄܳÉΪ²»Îȹ̵ÄԴȪ¡£×¨ÐıàÂë¡¢¼á³Öѧϰ¡¢Æð¾¢Ïàͬ£¬¶¼ÊÇÓ¦¶ÔÕâÀàÎÊÌâµÄºÃ²½·¥¡£