未定義行爲

在計算機程序設計中 ， 未定義行爲  是指執行某種計算機代碼所產生的結果 ， 這種代碼在當前程序狀態下的行爲在其所使用的中沒有規定 。 常見於對源代碼存在某些假設 ， 而執行時這些假設不成立的情況 。 一些編程語言中 ， 某些情況下存在未定義行爲 ， 以C和C + + 最爲著名 。 在這些語言的標準中 ， 規定某些操作的語義是未定義的 ， 典型的例子就是程序錯誤的情況 ， 比如越界訪問數組元素 。 標準允許語言的具體實現做這樣的假設 ： 只要是符合標準的程序代碼 ， 就不會出現任何類似的行爲 。 具體到 C / C++ 中 ， 編譯器可以選擇性地給出相應的診斷信息 ， 但沒有對此的強制要求 ： 針對未定義行爲 ， 語言實現作出任何反應都是正確的 ， 類似於數字邏輯中的 。 雖然編譯器實現可能會針對未定義行爲給出診斷信息 ， 但保證編寫的代碼中不引發未定義行爲是程序員自己的責任 。 這種假設的成立 ， 通常可以讓編譯器對代碼作出更多優化 ， 同時也便於做更多的編譯期檢查和靜態程序分析 。 有時候也可能存在對於未定義行爲本身的限制性要求 。 例如 ， 在CPU的指令集說明中可能將某些形式的指令定爲未定義 ， 但如果該CPU支持內存保護 ， 說明中很可能會還會包含一條兜底的規則 ， 要求任何用戶態的指令都不會讓操作系統的安全性受損 ； 這樣一來 ， 在執行未定義行爲的指令時 ， 就允許CPU破壞用戶寄存器 ， 但不允許發生諸如切換到監控模式的操作 。 和 （ unspecified behavior ） 不同 ， 未定義行爲強調基於不可移植或錯誤的程序構造 ， 或使用錯誤的數據 。 一個符合標準的實現可以在假定未定義行爲永遠不發生 （ 除了顯式使用不嚴格遵守標準的擴展 ） 的基礎上進行優化 ， 可能導致原本存在未定義行爲 （ 例如有符號數溢出 ） 的程序經過優化後顯示出更加明顯的錯誤 （ 例如死循環 ） 。 因此 ， 這種未定義行爲一般應被視爲bug 。