参数验证

大多数安全性增强的 CRT 函数,以及许多其他函数,验证了其参数,例如检查 NULL 的指针、整数属于有效范围或枚举值有效等。 如果发现无效参数,将调用无效参数处理程序。

无效参数处理程序例程

当 C 运行时库函数检测到无效参数时,会捕获一些错误相关信息,然后调用一个宏来包装无效参数处理程序调度函数。 将是 _invalid_parameter_invalid_parameter_noinfo_invalid_parameter_noinfo_noreturn 之一。 调用的调度函数取决于你的代码是否分别为调试版本、零售版本,或错误是否被视为不可恢复。

在调试版本中,在调用调度函数之前,无效参数宏通常会引发失败断言和调试器断点。 运行代码时,可能会向具有“中止”、“重试”和“继续”或类似选项的对话框中的用户报告断言,具体取决于操作系统和 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

另请参阅

CRT 中的安全性功能
C 运行时 (CRT) 和 C++ 标准库 (STL) .lib 文件