安全函数(后缀为_s)的参数检查和…

来源:互联网 发布:淘宝网优衣库旗舰店 编辑:程序博客网 时间:2024/05/16 08:05

所有安全(后缀为_s)函数的首要任务是验证传给它们的参数值。要检查的项目包括指针不为NULL,整数在有效范围内,枚举值是有效的,而且缓冲区足以容纳结果数据。如果当中任何一项失败了,函数都会设置局部于线程的C运行时变量errno。然后,并返回一个errno_t值来指出成功或失败。然而这些函数并不实际返回。相反,如果是一次调试版(debug)构建,它会显示一个对用户不太友好的DebugAssertion Failed对话框。然后,终止程序执行,如果说发行版(release),则直接终止程序进行。

    安全函数(后缀为_s)的参数检查和_set_invalid_parameter_handler的使用


   C运行时实际上允许我们提供自己的函数,这样一来,在它检测到一个无效参数时,就会调用这个函数。然后在这个函数中,我们可以记录失败,附上一个调试器,或者做其它我们想做的事。为了启用这个功能,主要有以下步骤:

  1. 定义一个函数,原型如下:

    void InvalidParameterHandler(const wchar_t*expression,const wchar_t*function,

        const wchar_t*file, unsigned int line, uintptr_t );

    其中的expression描述了C运行时实现代码可能出现的函数调用失败。

    function、file和line分别描述了出现错误的的函数名称,源代码文件和源代码行号。

    2.    调用_set_invalid_parameter_handler注册该处理函数。

    3.    然而仅仅上面,还不行,因为DebugAssertionFailed对话框仍然会出现。我们要在应用程序的开头调用_CrtSetReportMode(_CRT_ASSERT,0);从而禁止可能由C运行时触发的所有DebugAssertion Failed对话框。

 

下面是示例代码:

#include <stdio.h>

#include <stdlib.h>

#include <tchar.h>

#include <crtdbg.h>

#ifdef UNICODE 

#define TEXT(quote)  L##quote

#else

#define TEXT(quote)  quote

#endif

 

void InvalidParameterHandler(const wchar_texpression,const wchar_tfunction,

     const wchar_tfile, unsigned int line, uintptr_t);

 

int main(){

    _invalid_parameter_handler oldhandle;

    oldhandle _set_invalid_parameter_handler(InvalidParameterHandler);

    _CrtSetReportMode(_CRT_ASSERT,0);

    //TCHAR* pstr NULL;

    TCHAR szDest[10];

    //_stprintf_s(szDest,sizeof(szDest),TEXT("01234567891"));

    //_tprintf(pstr);

    _sntprintf_s(szDest,sizeof(szDest),TEXT("0123456789"));

    return 0;

}

 

void InvalidParameterHandler(const wchar_texpression,const wchar_tfunction,

     const wchar_tfile, unsigned int line, uintptr_t){

    printf("expression:%S.\nfunction: %S.\nfile: %S.\nline: %d\n",expression,function,file,line);

}

 

 

 

运行结果为:

安全函数(后缀为_s)的参数检查和_set_invalid_parameter_handler的使用


原创粉丝点击