[問題] x64 Release VS2013 bug嗎?
開發平台:
VS2013 on Win7 64bit
問題:
win32-Debug, win32-Release, x64-Debug 皆不會發生,
唯獨 x64-Release 會發生。
餵入的資料:
沒有
預期的正確結果:
AA00
錯誤結果:
0000
程式碼:
int main(int argc, char* argv[])
{
char data[] = "AA+";
char buffer[] = "0000";
const char* ptr = data;
const char* next = strchr(ptr, '+');
for (long i = 0; i < (next - ptr); ++i)
buffer[i] = data[i];
puts(buffer);
return 0;
}
補充說明:
已嘗試更新到 update 3,問題依舊。
相同的程式碼在 C++Builder XE6 上沒有問題。
請同事使用 VS2010 build x64-Release 似乎沒問題
(他是XP,編譯好丟到我電腦執行)。
毫無頭緒
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.129.85.237
※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1409056197.A.700.html
推
08/26 21:23, , 1F
08/26 21:23, 1F
您說的方法我有試過,也試了很多其它會進入迴圈的寫法。
但,不明白的是為何 debug 版不會發生呢?
如果是說 Release 有做最佳化的動作,那為什麼 win32-Release 不會發生呢?
如果是變數轉型的關係,那為何 C++Builder XE6 的 64bit Release 不會發生?
如果是VC天生如此,那為何 VS2010 的 x64-Release 不會發生呢?
避免發生的方法很多,只是我期望能求得甚解罷了>"< 感恩~
※ 編輯: yayax (220.129.85.237), 08/26/2014 23:14:47
推
08/26 23:27, , 2F
08/26 23:27, 2F
推
08/26 23:31, , 3F
08/26 23:31, 3F
→
08/26 23:31, , 4F
08/26 23:31, 4F
→
08/26 23:32, , 5F
08/26 23:32, 5F
→
08/26 23:42, , 6F
08/26 23:42, 6F
推
08/26 23:49, , 7F
08/26 23:49, 7F
→
08/26 23:49, , 8F
08/26 23:49, 8F
→
08/26 23:51, , 9F
08/26 23:51, 9F
to LiloHuang:
好的~明天我來當一下薪水小偷試試看。
to firose:
請問您也是VS2013嗎@@?
to Killercat:
也感謝您撥冗回答^^
to LPH66:
我一開始也是朝變數轉型的方向去試,但...我把
const char* next = strchr(ptr, '+');
改成
const char* next = &data[2];
其它完全不動,一切就如同和平的世界一樣的美好了。
※ 編輯: yayax (220.129.85.237), 08/27/2014 01:26:32
→
08/27 19:23, , 10F
08/27 19:23, 10F
我把 VS2013 與 VS2010 的反組譯結果比對了一下,
下面分別是 VS2013 變數 i 的型態為 long 以及 long long 的結果~ (一樣的部分就不
列出來了,只貼不一樣的地方)
for (long i = 0; i < (next - ptr); ++i)
000000013FFE1040 lea rcx,[data]
000000013FFE1045 sub rax,rcx
000000013FFE1048 cmp qword ptr [buffer],rax
000000013FFE104D jge main+61h (013FFE1061h)
000000013FFE104F lea rdx,[data]
000000013FFE1054 lea rcx,[buffer]
for (long long i = 0; i < (next - ptr); ++i)
000000013F5C1040 lea rcx,[data]
000000013F5C1045 sub rax,rcx
000000013F5C1048 test rax,rax
000000013F5C104B jle main+5Fh (013F5C105Fh)
000000013F5C104D lea rdx,[data]
000000013F5C1052 lea rcx,[buffer]
而,VS2010 的變數 i 型態為 long 時,編譯出來會跟下面 long long 的結果一樣,而
不是跟上面一樣。
謎呀~
※ 編輯: yayax (220.129.85.237), 08/27/2014 19:39:05
→
08/27 19:40, , 11F
08/27 19:40, 11F
→
08/27 19:47, , 12F
08/27 19:47, 12F
→
08/27 19:50, , 13F
08/27 19:50, 13F
→
08/27 20:02, , 14F
08/27 20:02, 14F
咦! 既然別人不會,那我可能就要朝我自己設定有問題的方向找找問題出在哪了~
我就很單純的開個 ConsoleApplication,然後貼上那些程式碼,
再 #include <string.h>,並新增 x64 組態,其它設定完全沒動呀!
而且公司跟家裡雖然都是 VS2013,但來源並不一樣,build 出來的情況卻一模一樣!
嗯,我也覺得反組譯出來很奇怪~ 但卻找不出來造成這樣的原因~
發生機率100% ~
※ 編輯: yayax (220.129.85.237), 08/27/2014 21:25:16
推
08/27 21:52, , 15F
08/27 21:52, 15F
推
08/27 21:55, , 16F
08/27 21:55, 16F
→
08/27 21:57, , 17F
08/27 21:57, 17F
Compiler Version 18.00.21005.1 for x64 這是家裡的,公司的要等明天下班才能跟您
回報。 感謝幫忙測試唷~
※ 編輯: yayax (220.129.85.237), 08/27/2014 23:09:09
推
08/27 23:12, , 18F
08/27 23:12, 18F
→
08/27 23:14, , 19F
08/27 23:14, 19F
→
08/27 23:18, , 20F
08/27 23:18, 20F
→
08/27 23:18, , 21F
08/27 23:18, 21F
→
08/27 23:26, , 22F
08/27 23:26, 22F
→
08/27 23:27, , 23F
08/27 23:27, 23F
→
08/27 23:54, , 24F
08/27 23:54, 24F
→
08/28 00:06, , 25F
08/28 00:06, 25F
推
08/28 00:37, , 26F
08/28 00:37, 26F
→
08/28 00:39, , 27F
08/28 00:39, 27F
Bingo! 原來更新檔這麼大! 那公司的肯定沒更新成功了...
剛升級到 Update 3 - Compiler Version 18.00.30723 for x64
正常了!!~~ 感謝大家的幫忙 ~看來真的有可能是原始版本的 bug
明天再回報公司版本是否也在更新後就修正了^^~ 3Q3Q~
※ 編輯: yayax (220.129.85.237), 08/28/2014 01:07:52
→
08/28 21:15, , 28F
08/28 21:15, 28F
→
09/01 19:09, , 29F
09/01 19:09, 29F
推
09/08 01:03, , 30F
09/08 01:03, 30F
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章