[問題] x64 Release VS2013 bug嗎?

看板C_and_CPP (C/C++)作者 (夜夜叉)時間11年前 (2014/08/26 20:29), 11年前編輯推噓9(9021)
留言30則, 7人參與, 最新討論串1/1
開發平台: 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
(long)(next-ptr) 加個轉型就會進迴圈。
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
指標相減得到的值型態是 ptrdiff_t
08/26 23:27, 2F

08/26 23:31, , 3F
你仔細看debug版的初始化pointer 不是0 是7fffffff
08/26 23:31, 3F

08/26 23:31, , 4F
release的話絕大多數都形態都會初始成bitwise 0
08/26 23:31, 4F

08/26 23:32, , 5F
誒等等 你不是這個問題,我搞錯了 請跳過 XD
08/26 23:32, 5F

08/26 23:42, , 6F
我測試沒問題耶 Win7 x64 release
08/26 23:42, 6F

08/26 23:49, , 7F
改一下編譯器設定 /FAcs 可輸出機器碼以及組語對照
08/26 23:49, 7F

08/26 23:49, , 8F
這種時候看組合語言或機器指令最清楚了...
08/26 23:49, 8F

08/26 23:51, , 9F
把輸出的 .cod 檔案內容跟 VC2010 的比較一下便知道
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
AntaresStar也是VS2013嗎? 我目前試2010 & 2008 都不會發生
08/27 19:40, 11F

08/27 19:47, , 12F
VS2013 update 3, Win7 X64 SP1
08/27 19:47, 12F

08/27 19:50, , 13F
我用long跟long long都跑出下面那種code
08/27 19:50, 13F

08/27 20:02, , 14F
上面那組 cmp怎麼會是位址比距離 不對啊
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
VS Express 2013 Update 3 + Win 7 幫你測試後一切正常
08/27 21:52, 15F

08/27 21:55, , 16F
cl.exe 編譯器版號是 18.00.30723 for x64
08/27 21:55, 16F

08/27 21:57, , 17F
不妨開命令提示字元視窗,看看是用哪一個版本的 cl.exe
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
建議可再開啟VS視窗,選擇[工具]->[擴充功能和更新]
08/27 23:18, 20F

08/27 23:18, , 21F
再檢查一下是否有更新出現...
08/27 23:18, 21F

08/27 23:26, , 22F
我的cl是18.00.30723 還真的不一樣
08/27 23:26, 22F

08/27 23:27, , 23F
所以看起來原po的版本說不定確實有bug XD
08/27 23:27, 23F

08/27 23:54, , 24F
家裡的沒更新,公司的有。馬上來更個新
08/27 23:54, 24F

08/28 00:06, , 25F
等等..或許公司的也沒安裝成功...orz
08/28 00:06, 25F

08/28 00:37, , 26F
既然家裡的編譯後的結果跟公司的一樣,然後家裡沒更新
08/28 00:37, 26F

08/28 00:39, , 27F
恐怕真的是還停留在原始版本 XD 靜候佳音囉 :)
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
家裡與公司各自升級至Update3。已不會再發生相同問題。
09/01 19:09, 29F

09/08 01:03, , 30F
恭喜原 po 解決問題囉 :)
09/08 01:03, 30F
文章代碼(AID): #1J_7t5S0 (C_and_CPP)
文章代碼(AID): #1J_7t5S0 (C_and_CPP)