簡體   English   中英

VS2013的奇怪行為

[英]Strange behavior of VS2013

最近,我在發布模式下崩潰,而在調試模式下卻無法正常運行。

通過深入檢查我的代碼,我發現我忘記在函數末尾return true ,這會導致崩潰。 如果失敗,該函數應返回false,否則返回true。

我在徘徊這是否是編譯器的缺陷(與2013年相比),因為它(也許)為我在函數末尾添加了return true語句,但是在發布時卻沒有。 因此,程序員應該花很多時間來調試故障,盡管程序員應該對此負責。

:)

從應該返回值的函數的末尾流出是未定義的行為。 未定義的行為意味着編譯器可以執行任何操作並且仍然合規。 發出警告消息是合規的。 不發出警告消息是合規的。 擦除硬盤驅動器:這也符合要求。 對我來說幸運的是,這還沒有發生。 我經歷了很多次調用未定義行為的不幸。

這是不確定行為的一個原因是,在某些奇怪的情況下,流分析無法確定函數是否返回值。 另一個原因是,您可能已經使用匯編程序以一種可以在計算機上正常工作的方式來設置返回值。 第三個原因是編譯器必須進行流量分析才能確定。 除非啟用優化,否則許多編譯器不會這樣做。

也就是說,在右括號之前缺少返回值通常會觸發編譯器檢查函數是否返回值。 編譯器發出警告時對您很好。

您收到警告消息並忽略了它-絕對不要這樣做。 使用設置為較高級別的標志進行編譯,並處理每個警告。 代碼應始終編譯干凈。 總是。

C和C ++是容忍的語言。 當程序員編寫即使看起來很奇怪也可以編譯的代碼時,編譯器會發出警告。 警告表示您正在寫可能包含錯誤的內容,但是要做出決定

它允許自願進行某些優化。 例如,您始終可以將2D數組用作1D數組,而在某些其他語言中則無法做到。 但是, 如果您不確定自己為什么要強迫編譯器執行其不喜歡的操作,則對方永遠不會忽略警告。

結論:只要他忽略了最終導致錯誤的警告, 程序員就應該責備;-)

暫無
暫無

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

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