[問題] volatile的正確用法

看板C_and_CPP作者 (程式宅 <囧>)時間9年前 (2014/09/12 22:21), 編輯推噓1(109)
留言10則, 4人參與, 最新討論串1/6 (看更多)
開發平台(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

09/13 03:05, , 1F
看起來是有機會被最佳化掉
09/13 03:05, 1F

09/13 03:15, , 2F
我想這算是要求編譯器給個保證..
09/13 03:15, 2F

09/13 03:21, , 3F
但是中間那段話我也有點不知其所以
09/13 03:21, 3F

09/13 03:23, , 4F
感覺 C11 的那個實作除了比較慢沒有太大問題
09/13 03:23, 4F

09/13 07:29, , 5F
我的問題是如果可能被最佳化掉, 那為什麼大家都這麼做
09/13 07:29, 5F

09/13 07:29, , 6F
還是大家約定俗成完全無視?
09/13 07:29, 6F

09/14 01:19, , 7F
話說這篇有part2 結論有點恐怖...
09/14 01:19, 7F

09/14 04:29, , 8F
總覺得太鑽牛角尖了 真的是非常非常罕見的例子吧XD?
09/14 04:29, 8F

09/14 09:00, , 9F
沒辦法, 自從heartbleed之後,大家對資安特別敏感
09/14 09:00, 9F

09/14 09:01, , 10F
哪邊該清沒清總是要特別關心,不然不重要誰理他
09/14 09:01, 10F
文章代碼(AID): #1K4m5qQl (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1K4m5qQl (C_and_CPP)