BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

memcpy()函数即将禁用

| 作者 Abel Avram 关注 10 他的粉丝 ,译者 王波 关注 0 他的粉丝 发布于 2009年5月26日. 估计阅读时间: 5 分钟 | QCon上海2018 关注大数据平台技术选型、搭建、系统迁移和优化的经验。

微软已经建议禁用memcpy()函数,该函数很可能会在今年底出现在微软的SDL禁用列表中。memcpy()加入到strcpy, strncpy, strcat, strncat等常用函数的队伍中,都是由于可通过缓存溢出进行安全攻击而被禁用。

一些微软的安全更新由于memcpy()的原因而发布:MS03-030 (DirectX)、MS03-043 (Messenger Service)、MS03-044 (Help and Support)、MS05-039 (PnP)、MS04-011 (PCT)、MS05-030 (Outlook Express)、CVE-2007-3999 (MIT Kerberos v5)、CVE-2007-4000 (MIT Kerberos v5)及其他。

微软禁用的函数有memcpy()、CopyMemory()和RtlCopyMemory()。要禁用这些函数,编程人员可添加以下#pragma代码行到头文件,编译器每一次遇到该行代码的时候都会发出警告。

#pragma deprecated (memcpy, RtlCopyMemory, CopyMemory)

或者针对C++的选项使用下列代码:

#define _CRT_SECURE_WARNINGS_MEMORY

对于GCC使用以下代码:

#pragma GCC poison memcpy RtlCopyMemory CopyMemory
推荐使用的代替函数是memcpy_s(),它在VC++ 2008的签名如下:

errno_t __cdecl
memcpy_s(
_Out_opt_bytecap_post_bytecount_(_DstSize, _MaxCount)
void * _Dst,
_In_ rsize_t _DstSize,
_In_opt_bytecount_(_MaxCount) const void * _Src,
_In_ rsize_t _MaxCount
);

在某人可能设定比实际分配更大的代码空间的时候,memcpy_s()没有memcpy()那样的安全弱点,所以不容易出错。

完整的SDL列表包含许多禁用的函数调用和建议替代的函数。部分摘录如下:

Description
描述
Banned function
禁用函数
Recommended function
推荐函数
String copy
字符串复制函数
strcpy, wcscpy, _tcscpy, _mbscpy, StrCpy, StrCpyA, StrCpyW, lstrcpy, lstrcpyA, lstrcpyW, strcpyA, strcpyW, _tccpy, _mbccpy strcpy_s
String concatenation
字符串连接函数
strcat, wcscat, _tcscat, _mbscat, StrCat, StrCatA, StrCatW, lstrcat, lstrcatA, lstrcatW, StrCatBuffW, StrCatBuff, StrCatBuffA, StrCatChainW, strcatA, strcatW, _tccat, _mbccat strcat_s
Sprintf
Sprintf函数
wnsprintf, wnsprintfA, wnsprintfW, sprintfW, sprintfA, wsprintf, wsprintfW, wsprintfA, sprintf, swprintf, _stprintf sprintf_s
Tokenizing函数 strtok, _tcstok, wcstok, _mbstok strtok_s
Scanf scanf, wscanf, _tscanf, sscanf, swscanf, _stscanf sscanf_s
Numeric conversions
数值转换函数
_itoa, _itow, _i64toa, _i64tow, _ui64toa, _ui64tot, _ui64tow, _ultoa, _ultot, _ultow _itoa_s, _itow_s
Gets gets, _getts, _gettws gets_s

 

SDL提供了头文件(banned.h),编程人员一旦使用所有被禁用函数就会得到相关的警告。另一种可选的方式是编程人员可以在VS2005或后续版本中使用/W4-C4996编译选项。

查看英文原文:memcpy() Is Going to Be Banned

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

infoQ页面 by hao Iron

infoQ页面一有大的表格右边的文章推荐就跳掉下面,美工怎么不理一下呢?

Re: infoQ页面 by Zhang Lei

如果应用要考虑跨平台,似乎就没法考虑了

Re: infoQ页面 by 霍 泰稳

我这儿没有出现这个问题,你的显示器分辨率是多少?

显示确实有点小问题 by liu tao

我用firefox,分辨率1024*768,表格显示不完整右边的部分被右边栏挡住了

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

4 讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT