最近被吵得很兇的Safe C/C++,主要討論的是沒有Undefined Behavior
這件事
What’s Undefined Behavior
基本上就是一個逃生艙口,Compiler可以跳過某些邏輯的推理,正確的邏輯永遠不會引發UB,不正確的邏輯(可能)會引發UB
舉個例子:
1 | int f(bool init) { |
觸犯了UB,所以gcc/clang開啟Optimization時會產生
1 | f(bool): |
不過Undefined Behavior是Runtime Concept,所以以下的程式碼只有在Runtime才會發生UB
1 | int nervous(bool is_scary, int n) |
所以Undefined Behavior Sanitizer只能在Runtime下使用t,也不能保證抓到所有UB,只要UB Code沒被執行到,整個程式行為還是受到標準限制的
How to archive safety
基本上分成兩個流派
- 程式語言中本身就沒有Undefined operations,如Java,Python,不過也是犧牲了一部分的速度和超能力,沒有十全十美的
- 將程式語言切分為Safe跟Unsafe的部分,如Rust
- Safe的地方由Compiler保證,不會有任何UB發生
- Unsafe的地方也沒有什麼特異功能,只是相信Unsafe的地方不會有任何問題
Future of safety C++
老實說,我不知道
Safecpp提供了一套類似於Rust的機制,不過那已經不算是C++了
Profile機制只打算完成80%的Safety,如果能達到這目標,我覺得夠用了,不過要說服NSA和美國政府是另一回事了