参数验证
大多数安全性增强的 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
。