參數驗證
大部分安全性增強的CRT函式,以及許多不是的函式,都會驗證其參數,例如檢查的指標 NULL
、該整數落入有效範圍,或該列舉值有效。 如果找到無效的參數,則會呼叫無效的參數處理程式。
無效的參數處理程式例程
當 C 執行時間連結庫函式偵測到無效的參數時,它會擷取有關錯誤的一些資訊,然後呼叫包裝無效參數處理程式分派函式的巨集。 這會是、 _invalid_parameter_noinfo
或 _invalid_parameter_noinfo_noreturn
的_invalid_parameter
其中一個。 呼叫哪一個分派函式取決於您的程式代碼是否分別為偵錯組建、零售組建,或錯誤不會被視為可復原。
在偵錯組建中,無效的參數巨集通常會在呼叫分派函式之前引發失敗的判斷提示和調試程式斷點。 當程式代碼執行時,判斷提示可能會回報給使用者,該對話框中的對話方塊有 「中止」、「重試」和「繼續」或類似的選擇,視作業系統和CRT版本而定。 這些選項可讓使用者立即終止程式、附加調試程式,或讓使用者繼續執行呼叫分派函式的程序代碼。
無效的參數處理程式分派函式會呼叫目前指派的無效參數處理程式。 根據預設,無效的參數會呼叫 _invoke_watson
,這會導致應用程式關閉併產生迷你傾印。 如果操作系統啟用,對話框會詢問使用者是否想要將損毀傾印傳送至Microsoft進行分析。
您可以使用 函 _set_invalid_parameter_handler
式或 _set_thread_local_invalid_parameter_handler
將無效的參數處理程式設定為您自己的函式,來變更此行為。 如果您指定的函式未終止應用程式,則會將控件傳回給接收無效參數的函式。 在CRT中,這些函式通常會停止函式執行、設定 errno
為錯誤碼,並傳回錯誤碼。 在許多情況下, errno
值和傳回值都是 EINVAL
,表示無效的參數。 在某些情況下,會傳回更具體的錯誤碼,例如不正確檔案指標的 EBADF
傳入為參數。
如需 的詳細資訊errno
,請參閱errno
、 _doserrno
_sys_errlist
和 _sys_nerr
。