strcpy_s安全性表现在哪里?

brk1985 2016-12-13 08:26:22
一直没用strcpy_s函数,一般都是用strcpy函数之前判断目的缓冲区是否够大,
strcpy_s作为strcpy的安全版,不知道安全在哪里?我以下代码出错,感觉没体现出安全啊,如果安全,以下代码应该不出错才对啊(溢出部分舍弃掉也好啊)。


#include "stdafx.h"
#include <string>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
char str[5] = {0};
strcpy_s(str, 5, "abcdef");
return 0;
}
...全文
587 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Saleayas 2016-12-14
  • 打赏
  • 举报
回复
当缓冲区不足的时候,会出错返回,而不继续复制了。 这样就安全了。
  • 打赏
  • 举报
回复
引用 10 楼 brk1985 的回复:
[quote=引用 9 楼 akirya 的回复:] [quote=引用 4 楼 brk1985 的回复:] [quote=引用 2 楼 worldy 的回复:] 检查参数长度,如果超出范围应该就不拷贝了
我上面例子,debug版提示“”debug assertion failed“,release版中断出错。[/quote] 有错误直接出错这不很好的么,避免出现越界。 要知道越界的bug可是很灵异的,不知道什么时候回出错。[/quote] 假如我程序在跑,那客户看到的就是崩溃了。我希望的是不崩溃,从你的描述看,strcpy_s的安全性主要体现在更容易发现问题,而不是程序的健壮性,不管用不用安全函数都需要加逻辑判断。[/quote] 代码写的不好,崩溃是最好的结果了,否则潜在的逻辑错误都是定时炸弹。
zgl7903 2016-12-14
  • 打赏
  • 举报
回复
strcpy_s 在 Debug模式下会填充整个字符串(除最后一个字符)长度, 探测越界的可能性, 这样在程序返回时会比较容易发现溢出BUG 更安全的 用 strncpy_s

// crt_truncate.c
#include <stdlib.h>
#include <errno.h>

int main()
{
   char src[] = "1234567890";
   char dst[5];
   errno_t err = strncpy_s(dst, _countof(dst), src, _TRUNCATE);
   if ( err == STRUNCATE )
      printf( "truncation occurred!\n" );
   printf( "'%s'\n", dst );
}

副组长 2016-12-14
  • 打赏
  • 举报
回复
就是为了防止你: char str[5] = {0}; strcpy(str, "abcdef"); 这是微软这么认为的,搞了个 strcpy_s 函数,别人也有不同的意见。 个人认为,既然你使用C/C++,,越界的机会多了去了,防止越界是C/C++程序员的责任,搞一个这个有什么意义么?
brk1985 2016-12-14
  • 打赏
  • 举报
回复
引用 9 楼 akirya 的回复:
[quote=引用 4 楼 brk1985 的回复:] [quote=引用 2 楼 worldy 的回复:] 检查参数长度,如果超出范围应该就不拷贝了
我上面例子,debug版提示“”debug assertion failed“,release版中断出错。[/quote] 有错误直接出错这不很好的么,避免出现越界。 要知道越界的bug可是很灵异的,不知道什么时候回出错。[/quote] 假如我程序在跑,那客户看到的就是崩溃了。我希望的是不崩溃,从你的描述看,strcpy_s的安全性主要体现在更容易发现问题,而不是程序的健壮性,不管用不用安全函数都需要加逻辑判断。
  • 打赏
  • 举报
回复
引用 4 楼 brk1985 的回复:
[quote=引用 2 楼 worldy 的回复:] 检查参数长度,如果超出范围应该就不拷贝了
我上面例子,debug版提示“”debug assertion failed“,release版中断出错。[/quote] 有错误直接出错这不很好的么,避免出现越界。 要知道越界的bug可是很灵异的,不知道什么时候回出错。
Saleayas 2016-12-14
  • 打赏
  • 举报
回复
实际期望的不就是这样吗? 当出现安全错误的时候,应该立即中断。
worldy 2016-12-14
  • 打赏
  • 举报
回复

errno_t __cdecl memcpy_s(
    void * dst,
    size_t sizeInBytes,
    const void * src,
    size_t count
)
{
    if (count == 0)
    {
        /* nothing to do */
        return 0;
    }

    /* validation section */
    _VALIDATE_RETURN_ERRCODE(dst != NULL, EINVAL);
    if (src == NULL || sizeInBytes < count)
    {
        /* zeroes the destination buffer */
        memset(dst, 0, sizeInBytes);

        _VALIDATE_RETURN_ERRCODE(src != NULL, EINVAL);
        _VALIDATE_RETURN_ERRCODE(sizeInBytes >= count, ERANGE);
        /* useless, but prefast is confused */
        return EINVAL;
    }

    memcpy(dst, src, count);
    return 0;
}
brk1985 2016-12-14
  • 打赏
  • 举报
回复
引用 3 楼 Saleayas 的回复:
当缓冲区不足的时候,会出错返回,而不继续复制了。 这样就安全了。
如果返回值包含信息也行,实际上发现不是这样。是我理解错了? 我上面例子,debug版弹框提示“”debug assertion failed“,release版中断出错。
brk1985 2016-12-14
  • 打赏
  • 举报
回复
引用 1 楼 oyljerry 的回复:
主要是长度限制,加了一个参数来防止数组溢出
没起到防止作用?能否举个例子? 我上面例子,debug版提示“”debug assertion failed“,release版中断出错。
brk1985 2016-12-14
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
检查参数长度,如果超出范围应该就不拷贝了
我上面例子,debug版提示“”debug assertion failed“,release版中断出错。
赵4老师 2016-12-14
  • 打赏
  • 举报
回复
没有绝对的安全。
worldy 2016-12-13
  • 打赏
  • 举报
回复
检查参数长度,如果超出范围应该就不拷贝了
oyljerry 2016-12-13
  • 打赏
  • 举报
回复
主要是长度限制,加了一个参数来防止数组溢出

16,548

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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