簡體   English   中英

為什么不編譯為導致未定義行為的代碼發出錯誤

[英]Why doesn't compile issue an error for code that results in undefined behavior

例如,文章通常會說如果malloc和delete配對,或者說它是錯誤的而且不這樣做。

但是為什么編譯器不為我們做一些檢查。

是否會出現這種代碼是正確和有意的情況?因此,編譯器不能總是說這樣做是錯誤的嗎?

或者編譯器在技術上有困難嗎?

很多原因。 在我的頭頂。

  • 某些未定義的行為可能已將效果定義為特定於實現的擴展。

  • 某些未定義的行為僅基於程序的環境或輸入而發生,因此代碼可能會導致未定義的行為,但不一定會這樣做。

  • 許多未定義行為的實例很難診斷。 可能涉及可能在后續翻譯單元中發生沖突的事情。 如果它們易於診斷,那么標准很可能需要實施來發布診斷,就像在許多情況下一樣。

那么,你會怎么說呢?

int* p = (int*)malloc(sizeof(p));
foobar(&p);
delete p;

foobar是一個不同的編譯單元。 你不知道它做了什么。

實際上,在某些情況下,理論上不可能弄清楚malloc是否與刪除配對。 想象一下暫停問題和程序結束時的刪除。

編譯器不一定知道指針是使用newmalloc創建的,還是它只是指向堆棧上某些東西的指針。 但是,像valgrind這樣的內存調試程序可以找到其中一些錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM