參數驗證
大部分安全性增強的 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
。