[問題] 關於C++在VS2017上的溢位

看板C_and_CPP作者 (Jay)時間5年前 (2018/08/22 11:19), 5年前編輯推噓0(009)
留言9則, 5人參與, 5年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) WIN10 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VS2017 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) 問題(Question): 堆疊為主緩衝區的滿溢 餵入的資料(Input): 預期的正確結果(Expected Output): 錯誤結果(Wrong Output): 程式無法順利跑完 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) 補充說明(Supplement): 各位前輩好 小弟想要把一個大型程式從VS2003升到VS2017 由於這個程式經手人很多 所以程式有點大且有點雜 目前做法是在VS2017建構在一個一個問題解決 編譯及鏈結問題已解決但在程式運行時遇到堆疊溢位的問題 (之前在VS2003是不偵錯執行,但在VS2017不偵錯執行會直接關閉程式所以改用偵錯執行) 因為時間上的關係重寫是不太可能了 且小弟功力不足所以重構上也需要花很多時間 想詢問各位前輩如果遇到這種問題會怎麼解決 再請各位前輩給小弟一點方向 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.127.200.146 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1534907998.A.3A6.html

08/22 11:37, 5年前 , 1F
增加stack size
08/22 11:37, 1F
前輩您好 這個部份我有嘗試將堆疊及堆積設定為1000000 不過仍會發生溢位 ※ 編輯: asdfg1597860 (59.127.200.146), 08/22/2018 14:09:34

08/22 14:17, 5年前 , 2F
看一下/GS 參數說明,就懂原因了,修bug吧
08/22 14:17, 2F
前輩您好 現在我的想法也是抓bug 不過溢位的地方無跡可尋 目前猜測是程式指標回傳時找不到位置或是靜態記憶體配置太多(因為是C/C++語言寫的) ※ 編輯: asdfg1597860 (59.127.200.146), 08/22/2018 17:04:05 yamakazi: 你記憶體多大? 嵌入式比較容易overflow吧 前輩您好 程式是Base在window上喔 用MFC及C&C++寫成的

08/22 19:09, 5年前 , 3F
stack爆掉和malloc或是new無關,recursive太多層了
08/22 19:09, 3F
前輩您好 我目前偵錯模式運作下他會在某個函式中表示溢位,但這函式裡沒有recursive 只有MFC 中的Domodal函式 ※ 編輯: asdfg1597860 (59.127.200.146), 08/23/2018 10:00:03

08/23 17:30, 5年前 , 4F
你在偵錯模式應該能看到呼叫堆疊, 看裡面有沒有一堆函數
08/23 17:30, 4F

08/23 17:31, 5年前 , 5F
遞迴太多層的狀況會在裡面看到一個出現很多次的函數
08/23 17:31, 5F

08/23 17:31, 5年前 , 6F
那裡就是你的問題所在
08/23 17:31, 6F
https://imgur.com/a/BDRQNB9 附上我部份程式及溢位資訊,呼叫堆疊只有在溢位時才會出現訊息

08/23 17:33, 5年前 , 7F
有沒有開很大的 array 區域變數
08/23 17:33, 7F
目前能確定的有宣告大小為1024的char array ※ 編輯: asdfg1597860 (59.127.200.146), 08/27/2018 09:22:09

08/27 09:43, 5年前 , 8F
看起來不是stack炸掉 是超寫到DEP的barrier上去了
08/27 09:43, 8F

08/27 09:47, 5年前 , 9F
你在OnLesson開頭多宣告一個大一點char Array試試
08/27 09:47, 9F
前輩您好 這是OnLesson的程式 https://imgur.com/a/NXv15OF 這函式用來作流程控管 另外我嘗試前加入輩說OnLesson開頭宣告Array char buf[1024] 狀況會一樣 ※ 編輯: asdfg1597860 (59.127.200.146), 08/27/2018 11:19:29
文章代碼(AID): #1RVDPUEc (C_and_CPP)