关于strcpy_s源代码的问题

/*** 
*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结束符的工作。

 

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

 

你可能感兴趣的:(关于strcpy_s源代码的问题)