![](/img/trans.png)
[英]Are tautologies in compile-time evaluated code guaranteed to be executed / optimized away?
[英]Can guaranteed UB be rejected at compile-time?
考慮這個程序:
#include <stdio.h>
int main(void)
{
int x;
while ( 1 == scanf("%d", &x) )
printf("%c\n", "hello"[x]);
}
因為程序沒有UB,只要用戶不超出范圍輸入任何數字,編譯器必須成功編譯此0
- 4
。
但是,根據這個線程, UB可以及時返回。 現在考慮這個程序:
int main(void)
{
printf("hello\n");
"hello"[6];
}
對此程序的任何調用都會導致未定義的行為,並且因為這可能是時間旅行,所以此程序在任何調用中的整個行為都是未定義的。 因此,編譯器可以拒絕該程序而不生成可執行文件嗎? (我們可能會說UB回到編譯階段!)
因此,編譯器可以拒絕該程序而不生成可執行文件嗎?
是。 未定義行為的定義是:
本國際標准不強制要求的行為[注意:當本國際標准忽略任何明確的行為定義或程序使用錯誤的結構或錯誤數據時,可能會出現未定義的行為。 允許的未定義行為包括完全忽略不可預測的結果,在翻譯或程序執行期間以環境特征(有或沒有發出診斷消息)的特定行為, 終止翻譯或執行(發布時)一條診斷信息)。 許多錯誤的程序結構不會產生未定義的行為; 他們需要被診斷出來。 - 結束說明]
添加到Jonathan的答案。
第二個程序調用未定義的行為,編譯器有權停止轉換,因為未定義的行為不受限制(c11,3.4.3p1)。
第一個程序可能會調用未定義的行為,但編譯器無法停止轉換,因為並非所有執行路徑都會產生未定義的行為。
在缺陷報告#109中 ,C委員會說:
此外,如果給定程序的每個可能的執行都會導致未定義的行為,則給定的程序不嚴格符合。 一致的實現必須簡單地轉換嚴格符合的程序,因為該程序的某些可能的執行將導致未定義的行為。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.