Ò»³¡¿´ËƼòÆÓµÄ·¨Ê½Í»·¢¡°±¬Õ¨¡±¡ª¡ª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£¬²»ÄܼòÆÓµØÈÏΪ¡°´úÂë²»ÅӴ󡱾Ͳ»»á¶éÂä¡£Õâʵ¼ÊÉϳÉΪһÖÖ¶Ô×Ô¼º±àÂëϰ¹ßµÄÌôÕ½¡ª¡ªÔÚ¿´ËƼòÆÓÖÐÕÒµ½Ç±ÔÚµÄÅÓ´ó¡¢ÔÚ¡°½çÏÞ¡±ÖÐѧϰµ½ÈçºÎд³öÔ½·¢½áʵµÄ´úÂë¡£
Õâ¸öÎÊÌâÌáÐÑÎÒÃÇ£¬ÈκÎÉæ¼°µ×²ãµ×ÏߺÍÓÅ»¯µÄ»·½Ú¶¼¿ÉÄܳÉΪ²»Îȶ¨µÄԴȪ¡£ÓÃÐıàÂë¡¢±£³Öѧϰ¡¢»ý¼«Ïàͬ£¬¶¼ÊÇÓ¦¶ÔÕâÀàÎÊÌâµÄºÃ´ëÊ©¡£