strcpy_s的函数实现是啥?

mirroatl209 2013-11-13 10:44:25
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
...全文
518 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
todd_leftcode 2013-11-14
  • 打赏
  • 举报
回复
strcpy_s是微软的杰作。 至于实现,微软没有公布过源代码,你可以猜一下。
Exaybachay 2013-11-14
  • 打赏
  • 举报
回复
引用 9 楼 zhao4zhong1 的回复:
[quote=引用 8 楼 Exaybachay 的回复:] 这个就是该死的 编译警告 4996 那个时候的
#pragma warning(disable:4996) [/quote]是的, 每次都放到预编译头文件 #if _MSC_VER >= 1400
赵4老师 2013-11-14
  • 打赏
  • 举报
回复
引用 8 楼 Exaybachay 的回复:
这个就是该死的 编译警告 4996 那个时候的
#pragma warning(disable:4996)
Exaybachay 2013-11-14
  • 打赏
  • 举报
回复
这个就是该死的 编译警告 4996 那个时候的
赵4老师 2013-11-14
  • 打赏
  • 举报
回复
http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’,再点立即安装 再 参考: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strcpy_s.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\tcscpy_s.inl 和5楼内容一样。
lm_whales 2013-11-14
  • 打赏
  • 举报
回复
strcpy_s的 s 是 safe 的缩写,即strcpy 的安全版本。 就是,超过固定长度后面的字符,就不再拷贝字符了。 目的是,防止缓冲区攻击溢出,造成的栈溢出。 这个函数也不是绝对安全的,但是可以控制在一定范围之内,假如目标内存的是已知的。 那么,绝对不会造成越界访问。 最大的问题是,目标内存,可能不够长。 但是这对于,非安全版本,也是一种错误,所以可以忽略这个问题。
yulinlang 2013-11-14
  • 打赏
  • 举报
回复
/***
*strcpy_s.c - contains strcpy_s()
*
*   Copyright (c) Microsoft Corporation. All rights reserved.
*
*Purpose:
*   strcpy_s() copies one string onto another.
*
*******************************************************************************/

#include <string.h>
#include <internal_securecrt.h>

#define _FUNC_PROLOGUE
#define _FUNC_NAME strcpy_s
#define _CHAR char
#define _DEST _Dst
#define _SIZE _SizeInBytes
#define _SRC _Src

#include <tcscpy_s.inl>

/***
*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;
}

Liu_KaHo 2013-11-13
  • 打赏
  • 举报
回复
strcpy就知道。。你那个是自己定义的函数吧。。。
max_min_ 2013-11-13
  • 打赏
  • 举报
回复
是不是库函数啊?确定不是自己定义的函数?

64,662

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧