关于strcpy_s源代码的问题

来源:互联网 发布:dnf tp技能详细数据 编辑:程序博客网 时间:2024/06/02 06:11
/*** *tcscpy_s.inl - general implementation of _tcscpy_s * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       This file contains the general algorithm for strcpy_s and its variants. * ****/  _FUNC_PROLOGUE errno_t __cdecl _FUNC_NAME(_CHAR *_DEST, size_t _SIZE, const _CHAR *_SRC) {     _CHAR *p;     size_t available;       /* validation section */    _VALIDATE_STRING(_DEST, _SIZE);     _VALIDATE_POINTER_RESET_STRING(_SRC, _DEST, _SIZE);       p = _DEST;     available = _SIZE;     while ((*p++ = *_SRC++) != 0 && --available > 0)     {     }       if (available == 0)     {         _RESET_STRING(_DEST, _SIZE);         _RETURN_BUFFER_TOO_SMALL(_DEST, _SIZE);     }     _FILL_STRING(_DEST, _SIZE, _SIZE - available + 1);     _RETURN_NO_ERROR; }

 

_VALIDATE_STRING用来验证字符串的合法性,是否以null结尾。

_VALIDATE_POINTER_RESET_STRING是记录字符串的原始信息,以便拷贝失败以后恢复。

当目的地空间不够时,会根据_VALIDATE_POINTER_RESET_STRING记录的信息恢复字符串,并且(在Debug模式下)以弹出对话框的形式报告错误。

_FILL_STRING完成在字符串最后加上null结束符的工作。

 

但是有一个疑问需要各位高手解答,为什么微软的源代码不首先判断源字符串的长度与目的空间长度,如果目的空间长度小于字符串的长度,就不拷贝,这样也就省去了记录原始字符串信息以及需要恢复信息的麻烦。

 

原创粉丝点击