sprintf_s到底比sprintf安全在哪里?

milanleon 2017-04-21 10:27:05
运行下面代码,debug和release下都会崩溃:
char buf[3] = {0};
sprintf_s(buf, 3, "%s", "123");
...全文
687 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
zxphxh 2017-05-07
  • 打赏
  • 举报
回复
关注................
Tsuigod 2017-05-05
  • 打赏
  • 举报
回复
这里的所谓安全,就是多了个size,防止你复制的时候由于buffer空间不足,把原字符串末尾丢了,却不告诉你。
赵4老师 2017-05-03
  • 打赏
  • 举报
回复
ATM机比支付宝安全? 水果刀比菜刀安全?
赵4老师 2017-05-02
  • 打赏
  • 举报
回复
不要纠结各种安全了,这个世界上唯一不变的就是变化。 用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢! 用虚拟机还能木马整个CPU+主板+操作系统呢! 参考: 《黑客帝国》完全解析_知识库_博客园 《黑客帝国》里的锡安是不是虚拟世界_知识库_博客园
FD_2013 2017-05-02
  • 打赏
  • 举报
回复
虽然都崩溃了,但是一个是安全崩溃,另一个是不安全崩溃,这就是sprintf_s比sprintf安全的原因之所在
Rockismej 2017-04-29
  • 打赏
  • 举报
回复
引用 7楼赵4老师 的回复:
[quote=引用 5 楼 vcttyys 的回复:] 所以iPhone6S就是比iPhone6高级些,因为带s了
那用什么来保证那个s不是画蛇添足呢?[/quote]那就赵老师给解释下呗
赵4老师 2017-04-24
  • 打赏
  • 举报
回复
引用 5 楼 vcttyys 的回复:
所以iPhone6S就是比iPhone6高级些,因为带s了
那用什么来保证那个s不是画蛇添足呢?
encoderlee 版主 2017-04-23
  • 打赏
  • 举报
回复
你的代码写错了,当然会奔溃。

char buf[3] = {0};
sprintf_s(buf, 3, "%s", "123");

buf其实只能装2个字符,因为结尾还要装一个"/0"

强行多装东西进去,肯定要报错

正因为sprintf_s报错奔溃了,才是安全的。

如果没有奔溃,用sprintf的话,它会无脑写入内存,覆盖了后面的东西,容易被利用于缓冲区溢出攻击。
假如你写的是服务端代码,很容易因此被黑客黑掉。相当不安全。
paschen 版主 2017-04-21
  • 打赏
  • 举报
回复
前者会检查缓冲区的大小 后者可能会buf越界的情况
Rockismej 2017-04-21
  • 打赏
  • 举报
回复
所以iPhone6S就是比iPhone6高级些,因为带s了
赵4老师 2017-04-21
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止
yshuise 2017-04-21
  • 打赏
  • 举报
回复
字符串以‘\0’结束,你要多申请一个字符内存
ipqtjmqj 2017-04-21
  • 打赏
  • 举报
回复
sprintf_s保证一定会崩溃,sprintf不保证崩溃,从而越界

64,649

社区成员

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

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