0%

About Safety on C/C++

最近被吵得很兇的Safe C/C++,主要討論的是沒有Undefined Behavior這件事

What’s Undefined Behavior

基本上就是一個逃生艙口,Compiler可以跳過某些邏輯的推理,正確的邏輯永遠不會引發UB,不正確的邏輯(可能)會引發UB

舉個例子:

1
2
3
4
5
6
7
8
int f(bool init) {
    int a;
    if (init) {
        a = 6;
    }
    return a / 2;

}

觸犯了UB,所以gcc/clang開啟Optimization時會產生

1
2
3
f(bool):
mov eax, 3
ret

不過Undefined Behavior是Runtime Concept,所以以下的程式碼只有在Runtime才會發生UB

1
2
3
4
5
6
7
8
9
10
11
12
13
int nervous(bool is_scary, int n)
{
if (is_scary) {
return 100 / n;
} else {
return 0;
}
}

int main()
{
return nervous(false, 0);
}

所以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和美國政府是另一回事了

Reference