看板 C_and_CPP 關於我們 聯絡資訊
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) VC++/GCC/CLANG 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) None 問題(Question): volatile大概是C/C++最難了解的關鍵字之一 最近在看完這篇[How to zero a buffer](http://bit.ly/1wmpbys)產生的問題 在開啟最佳化之後,對照Assembly Code,所有的編譯器會捨棄掉stack上的memset。 不過如果照他的方式刻一個,會發現所有Compiler都會做清空的動作 static void secure_memzero(void * p, size_t len) { volatile uint8_t * _p = p; while (len--) *_p++ = 0; } 不過中間有句話不太明瞭 The C standard states that accesses to volatile objects are part of the unalterable observable behaviour — but it says nothing about accesses via lvalue expressions with volatile types. Consequently a sufficiently intelligent compiler can still optimize the buffer-zeroing away in this case — it just has to prove that the object being accessed was not originally defined as being volatile. 我不知道這段話是否正確,不過還沒找到Standard是否有類似的規定 如果這段話是正確的話,目前找到的 C11的[memset_s](http://bit.ly/1qJG7vv) Windows的[SecureZeroMemory](http://bit.ly/1oC33rV) 作法都一樣,難道不怕被最佳化掉嘛 請大家指點迷津吧.. -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 59.115.47.165 ※ 文章網址: http://www.ptt.cc/bbs/C_and_CPP/M.1410531700.A.6AF.html
Feis: 看起來是有機會被最佳化掉 09/13 03:05
Feis: 我想這算是要求編譯器給個保證.. 09/13 03:15
Feis: 但是中間那段話我也有點不知其所以 09/13 03:21
Feis: 感覺 C11 的那個實作除了比較慢沒有太大問題 09/13 03:23
windows2k: 我的問題是如果可能被最佳化掉, 那為什麼大家都這麼做 09/13 07:29
windows2k: 還是大家約定俗成完全無視? 09/13 07:29
lsc36: 話說這篇有part2 結論有點恐怖... 09/14 01:19
carylorrk: 總覺得太鑽牛角尖了 真的是非常非常罕見的例子吧XD? 09/14 04:29
windows2k: 沒辦法, 自從heartbleed之後,大家對資安特別敏感 09/14 09:00
windows2k: 哪邊該清沒清總是要特別關心,不然不重要誰理他 09/14 09:01