有趣的EVC4.0MIPSII编译器优化bug
//========================================================================
//TITLE:
// 有趣的EVC4.0MIPSII编译器优化bug
//AUTHOR:
// norains
//DATE:
// Friday 21-December-2007
//Environment:
// EVC4.0 + SDK-WINCE5.0-MIPSII
// VS2005 + SDK-WINCE5.0-MIPSII
//========================================================================
在写代码时偶然发现的,大家都来乐一乐.
首先必要的前提条件是,你是采用MIPSII来编译,
有这么一段简单的代码,大家凭直觉看看应该显示的是什么:
直觉告诉我们,显示的应该是"ABC". 恩,只是在evc4.0环境下,这个却就不全对了,如果你选择的是编译Release版本,并且优化选项为"Default"(也就是你在evc什么都没改时的默认设置),那么结果将是(如图):
呵呵,变成小写了.如果你的优化选项为其它,比如Maximize Speed等,都不会出现此灵异事件.
当然了,如果你选择的是别的CPU来进行编译,甚至是自带的标准模拟器,也不会查看到该灵异事件,因为在_tcslwr(TEXT("ABC")这个语句就已经出现内存溢出异常了(其实出现异常才是正确的)!而用MIPSII编译器进行编译,不但能够顺利通过,运行还正常,甚至选择MIPS默认优化还能有趣地出现灵异现象,实在不能不佩服微软在EVC4.0 MIPSII编译器的造诣啊 :-)
//TITLE:
// 有趣的EVC4.0MIPSII编译器优化bug
//AUTHOR:
// norains
//DATE:
// Friday 21-December-2007
//Environment:
// EVC4.0 + SDK-WINCE5.0-MIPSII
// VS2005 + SDK-WINCE5.0-MIPSII
//========================================================================
在写代码时偶然发现的,大家都来乐一乐.
首先必要的前提条件是,你是采用MIPSII来编译,
有这么一段简单的代码,大家凭直觉看看应该显示的是什么:
int WINAPI WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
_tcslwr(TEXT("ABC"));
TCHAR *pszInfo = new TCHAR[_tcslen(TEXT("ABC")) + 1];
_tcscpy(pszInfo,TEXT("ABC"));
MessageBox(NULL,pszInfo,TEXT(""),MB_OK);
delete []pszInfo;
return 0;
}
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
_tcslwr(TEXT("ABC"));
TCHAR *pszInfo = new TCHAR[_tcslen(TEXT("ABC")) + 1];
_tcscpy(pszInfo,TEXT("ABC"));
MessageBox(NULL,pszInfo,TEXT(""),MB_OK);
delete []pszInfo;
return 0;
}
直觉告诉我们,显示的应该是"ABC". 恩,只是在evc4.0环境下,这个却就不全对了,如果你选择的是编译Release版本,并且优化选项为"Default"(也就是你在evc什么都没改时的默认设置),那么结果将是(如图):
呵呵,变成小写了.如果你的优化选项为其它,比如Maximize Speed等,都不会出现此灵异事件.
当然了,如果你选择的是别的CPU来进行编译,甚至是自带的标准模拟器,也不会查看到该灵异事件,因为在_tcslwr(TEXT("ABC")这个语句就已经出现内存溢出异常了(其实出现异常才是正确的)!而用MIPSII编译器进行编译,不但能够顺利通过,运行还正常,甚至选择MIPS默认优化还能有趣地出现灵异现象,实在不能不佩服微软在EVC4.0 MIPSII编译器的造诣啊 :-)