看板 C_and_CPP 關於我們 聯絡資訊
※ [本文轉錄自 Programming 看板 #1OybZE4i ] 作者: moebear (萌熊) 看板: Programming 標題: [問題] 如何發現存取越界? c/c++(V.S.) 時間: Sun Apr 16 01:30:51 2017 開發平台:windows 10 目標環境:大概是linux,還是unix,分不太清楚。 開發軟體: visual studio 2015 c++ 各位好,最近有門課在用judge system,發現我常常會有存取越界的問題 但是在我的編譯軟體(visual studio 2015)上面會偵測不到這個問題, 我也有用系上的工作站(linux環境),直接用g++編譯後執行的話也沒有顯示存取越界 我想 既然judge可以找到這個問題 那在編譯軟體上面應該也可以......吧? 想問問看有沒有什麼方法可以幫助我找到哪邊有存取越界。 舉例來說: unsigned long long a[3]={1,2,3}; b=b/a[-1]; 今天遇到的大概是這樣的情況,我去追蹤,發現a[-1]是一個很大的正數, 在過程中是看不到他造成的影響,debug過程也沒有警告。 能不能在我存取到不該存取的位置之後能有警示? -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 140.113.91.189 ※ 文章網址: https://www.ptt.cc/bbs/Programming/M.1492277454.A.12C.html ※ 發信站: 批踢踢實業坊(ptt.cc) ※ 轉錄者: moebear (140.113.91.189), 04/16/2017 02:52:39 ※ 編輯: moebear (140.113.91.189), 04/16/2017 02:57:53
Hazukashiine: en.cppreference.com/w/cpp/container/array/at 04/16 03:00
Chikei: valgrind ? 04/16 03:03
Sylveon: try -fsanitize=address ? 04/16 04:38
LPH66: vs 應該是沒有 -fsanitize 的選項的樣子, 可能要靠外部工具 04/16 07:46
MOONY135: VS有的話我也想知道... 04/16 08:55
Ommm5566: 印象中google的gtest和benchmark偶爾可以攔截到這種錯誤 04/16 09:26
Ommm5566: 話說回來說這是你的問題 04/16 09:26
Ommm5566: C++提供很多工具,寫程式本來就是一直在做取捨 04/16 09:27
Ommm5566: 不做檢查程式碼會少,速度會快 04/16 09:27
Ommm5566: 每次執行檢查如果要做檢查,速度就是慢一倍 04/16 09:27
Ommm5566: 不然你以為為什麼debug mode遠遠比release mode慢 04/16 09:27
Ommm5566: 陣列傳進function還是要給size 連這都不檢查要怪誰 04/16 09:29
kwpn: 改用vector 呼叫at? 04/16 09:44
MOONRAKER: 這個雙黃線太爛了,開到對面居然不會把我彈回來。 04/16 10:32
MOONRAKER: (設計對白) 04/16 10:32
謝謝各位大大,at看起來滿符合要求的,之後會盡量改用at取。 我用 -fsanitize=address也得到一些錯誤回饋,謝謝各位。 我了解這是我程式設計的問題,我是希望能在已經確定我產生存取越界的時候, 能比較快地找到問題點,我的想法是,既然教授的系統可以做到這件事情, 沒有理由那些由大公司或是g++等編譯或是其他外掛程式沒有辦法做到 ※ 編輯: moebear (140.113.91.189), 04/16/2017 13:25:24
Ommm5566: at就是每次存取會檢查 你說的大公司系統也是 04/16 13:53
tuyutd0505: 通常教授的系統會抓這個都是要防止緩衝區溢位攻擊 04/16 13:58
tuyutd0505: 就是怕有學生黑他 04/16 13:58
er230059: 教授的server每天都有人在亂try吧XD 保護當然要做好 04/16 14:21