µ¼¶Á£º±¾ÎÄÀ´×Ô¡¶The most stupid C bug ever¡·ÕâÆªÎÄÕ£¬ÒëÎÄÓÉ¿á¿ÇÍø³Âð©ÕûÀí±àÒë¡¶CÓïÑÔÖÐÊ·ÉÏ×îÓÞ´ÀµÄBug¡·¡£ÄÚÈÝÈçÏ£º
ÎÄÕºÜÓÐÒâ˼£¬·ÖÏí¸ø´ó¼Ò¡£ÎÒÏàÐÅÕâÑùµÄbug£¬¾ÍËãÄãÊǸßÊÖÄãÒ²»á·¸µÄ¡£ÄãÀ´¿´¿´×÷Õß·¸µÄÕâ¸öBug°É¡£¡£
Ê×ÏÈ£¬×÷ÕßÏëÓÃÒ»¶Î³ÌÐòÀ´´´½¨Ò»¸öÎļþ£¬Èç¹ûÓÐÎļþÃûµÄ»°£¬¾Í´´½¨ÕæÕýµÄÎļþ£¬Èç¹ûûÓеϰ£¬¾Íµ÷ÓÃtmpfile()£¿´´½¨ÁÙʱÎļþ¡£ËûÕâ¶Î³ÌÐò¾ÍÊÇHTTPÏÂÔØµÄC³ÌÐò¡£code==200¾ÍÊÇHTTPµÄ·µ»ØÂë¡£
else if (code == 200) { // Downloading whole file
/* Write new file (plus allow reading once we finish) */
g = fname fopen(fname, "w+") : tmpfile();
}
µ«ÊÇÕâ¸ö³ÌÐò£¬Ö»ÄÜÔÚUnix/LinuxϹ¤×÷£¬ÒòΪ Microsoft µÄ tmpfile()µÄʵÏÖ ¾ÓȻѡÔñÁË C:\ ×÷ΪÁÙʱÎļþµÄ´æ·ÅĿ¼£¬Õâ¶ÔÓÚÄÇЩûÓйÜÀíԱȨÏÞµÄÈËÀ´Ëµ¾Í³ö´óÎÊÌâÁË£¬ÔÚWindows 7Ï£¬¾ÍËãÄãÓйÜÀíԱȨÏÞÒ²»áÓÐÎÊÌâ¡£ËùÒÔ£¬ÉÏÃæµÄ³ÌÐòÔÚWindowsƽ̨ÏÂÐèÒªÓò»Í¬µÄ·½Ê½À´´¦Àí£¬²»ÄÜÖ±½ÓʹÓÃWindowsµÄtmpfile()º¯Êý¡£
ÓÚÊÇ×÷Õß¾ÍÏȰÑÕâ¸öÎÊÌâ¼ÇÏÂÀ´£¬ÔÚ×¢ÊÍÖÐдÏÂÁËFIXME£º
else if (code == 200) { // Downloading whole file
/* Write new file (plus allow reading once we finish) */
// FIXME Win32 native version fails here because
// Microsoft's version of tmpfile() creates the file in C:\
g = fname fopen(fname, "w+") : tmpfile();
}
È»ºó£¬×÷Õß¾õµÃÐèҪдһ¸ö¿çƽ̨µÄ±àÒ룺
FILE * tmpfile ( void ) {
#ifndef _WIN32
return tmpfile();
#else
//code for Windows;
#endif
}
È»ºó£¬×÷Õß¾õµÃÕâÑùʵÏֺܲ»ºÃ£¬»á·¢ÏÖÃû×Ö³åÍ»£¬ÒòΪÕâÑùÒ»À´Õâ¸öº¯ÊýÌ«ÄÑ¿´ÁË¡£ÓÚÊÇËûÖØ¹¹ÁËÒ»ÏÂËûµÄ´úÂ롪¡ªÐ´Ò»¸ö×Ô¼ºÊµÏÖµÄtmpfile() ¨C w32_tmpfile£¬È»ºó£¬ÔÚWindows ÏÂÓú궨ÒåÀ´ÖØÃüÃûÕâ¸öº¯ÊýΪtmpfile()¡££¨³Âð©×¢£ºÕâÖÖÓ÷¨ÊDZȽϱê×¼µÄ¿çƽ̨´úÂëµÄд·¨£©
#ifdef _WIN32
#define tmpfile w32_tmpfile
#endif
FILE * w32_tmpfile ( void ) {
//code for Windows;
}
¸ã¶¨£¡±àÒë³ÌÐò£¬ÔËÐС£¿¿£¡¾ÓȻûÓе÷Óõ½ÎÒµÄw32_tmpfile()£¬Ê²Ã´ÎÊÌ⣿µ÷ÊÔ£¬µ¥²½¸ú×Ù£¬¹ûȻûÓе÷Óõ½£¡ÄѵÀÊÇÎʺűí´ïʽÓÐÎÊÌ⣿¸Ä³Éif ¨C else Óï¾ä£¬ºÃÁË£¡
if(NULL != fname) {
g = fopen(fname, "w+");
} else {
g = tmpfile();
}
Îʺűí´ïʽ²»Ó¦¸ÃÓÐÎÊÌâ°É£¬ÄѵÀÎÒÃǵĺê¶ÔÎʺűí´ïʽ²»Ö±×÷Óã¬ÕâÄѵÀÊDZàÒëÆ÷µÄÔ¤±àÒëµÄÒ»¸öbug£¿×÷Õß»³Òɵ½¡£
ÏÖÔÚÎÒÃǰÑËùÓеĴúÂëÁ¬ÔÚÒ»Æð¿´£¬²¢±È½Ïһϣº
ÄÜÕý³£¹¤×÷µÄ´úÂë
Äܹ¤×÷µÄ´úÂë
#ifdef _WIN32
# define tmpfile w32_tmpfile
#endif
FILE * w32_tmpfile ( void ) {
code for Windows;
}
else if (code == 200) { // Downloading whole file
/* Write new file (plus allow reading once we finish) */
// FIXME Win32 native version fails here because
// Microsoft's version of tmpfile() creates the file in C:\
//g = fname fopen(fname, "w+") : tmpfile();
if(NULL != fname) {
g = fopen(fname, "w+");
} else {
g = tmpfile();
}
}
²»ÄÜÕý³£¹¤×÷µÄ´úÂë
²»Äܹ¤×÷µÄ´úÂë
#ifdef _WIN32
# define tmpfile w32_tmpfile
#endif
FILE * w32_tmpfile ( void ) {
code for Windows;
}
else if (code == 200) { // Downloading whole file
/* Write new file (plus allow reading once we finish) */
// FIXME Win32 native version fails here because
// Microsoft's version of tmpfile() creates the file in C:\
g = fname fopen(fname, "w+") : tmpfile();
}
Ò²ÐíÄãÔÚÒ»¿ªÊ¼¾Í¿´µ½ÁËÕâ¸öbug£¬µ«ÊÇ×÷ÕßûÓС£ËùÓеÄÎÊÌâ¶¼³öÔÚ×¢ÊÍÉÏ£º
/* Write new file (plus allow reading once we finish) */
// FIXME Win32 native version fails here because
// Microsoft's version of tmpfile() creates the file in C:\
Äã¿´µ½ÁË×îºóÄǸöC:\Âð£¿ÔÚCÖУ¬¡°\¡± ´ú±í´ËÐÐûÓнáÊø£¬ÓÚÊÇ£¬ºóÃæµÄ´úÂëÒ²³ÉÁË×¢ÊÍ¡£Õâ¾ÍÊÇÕâ¸öbugµÄÕæÕýÔÒò£¡
¶øÖ®ËùÒԸijÉif-elseÄܹ¤×÷µÄÔÒòÊÇÒòΪ×÷Õß×¢ÊÍÁËÀϵÄÎʺűí´ïʽµÄ´úÂ룬ËùÒÔ£¬ÄǶÎÄܹ¤×÷µÄ´úÂë³ÉÁË£º
/* Write new file (plus allow reading once we finish) */
// FIXME Win32 native version fails here because Microsoft's version of tmpfile() creates the file in C:
//g = fname fopen(fname, "w+") : tmpfile();
if(NULL != fname) {
g = fopen(fname, "w+");
} else {
g = tmpfile();
}
ÎÒÏàÐÅ£¬µ±×÷ÕßÕÒµ½Õâ¸öÎÊÌâµÄÔÒòºó£¬Ò»¶¨»áÂîÒ»¾ä¡°ÂèµÄ¡±£¡ÎÒÒ²ÏàÐÅ£¬Õâ¸öbug»¨·ÑÁË×÷Õߺܶàʱ¼ä£¡
×îºó£¬ÎÒÒ²shareÒ»¸öÎÒÒÔǰ·¸µÄÒ»¸ö´í¡£
ÎÒÓÐÒ»¸öСº¯Êý£¬ÐèÒª´«ÈëÒ»¸öint* pIntµÄÀàÐÍ£¬È»ºóÎÒÐèÒªÔÚÎҵĴúÂëÀï °ÑÕâ¸öint* pInt×÷³ýÊý¡£ÓÚÊÇÎҵĴúÂë³ÉÁËÏÂÃæµÄÕâ¸öÑù×Ó£º
float result = num/*pInt;
¡.
/* some comments */
num++;
ÒòΪÎÒÔÚÎÒµ±Ê±ÓÃvi±àд´úÂ룬ËùÒÔûÓÐÓï·¨¸ßÁÁ£¬¶øÎҵijÌÐò¶¼±àÒëͨ¹ýÁË£¬µ«ÊÇÈ´³öÏÖÁËºÜÆæ¹ÖµÄÊ¡£ÎÒÒ²²»ÖªµÀ£¬ÓÃgdbµ÷ʽµÄʱºò£¬·¢ÏÖÓÐЩÓï¾äÖ±½Ó¾Í¹ýÁË¡£Õâ¸öÎÊÌâÈÃÎÒ»¨Á˺ܶàʱ¼ä£¬×îºó·¢ÏÖÎÊÌâÔÀ´ÊÇûÓпոñµ¼ÖÂ