memcpy strcpy memcpy

在移植DRM到Android4.2版本的时候,测试SD类型的DRM多媒体文件总是无法打开,SD类型的多媒体文件不包含版权,下载完成后,需要弹出一个对话框提示用户下载版权,这个对话框是有一个service监听事件后生成,这个service是在开机启动时注册到drmserver里面的,抓取log的时候发现,开机过程中drmserver起来之后总是挂了一次,挂了之后立即又重启了,但是我们的service只是在开机的时候只往drmserver里面注册一次,当注册了该service的drmserver挂掉后,虽然又重启了,但是这个drmserver没有注册该service,所以后续需要监听下载版权的事件的时候,都无法成功,进一步分析后发现,是一个内存越界的段错误导致。
最后定为到一个memcpy函数没有考虑到源数据大小的问题:代码类似如下(公司代码拿不出来):#define MAX_DRM_FILE_LENGTH 1024char* dst = new char[MAX_DRM_FILE_LENGTH];memset(dst, 0,MAX_DRM_FILE_LENGTH);if(dst == NULL) return;memcpy(dst,s->file,MAX_DRM_FILE_LENGTH);
上面调用memcpy的时候没有考虑到两个问题:1:memcpy的时候源地址和目的地址都不能越界,且源地址和目的地址不能有覆盖;2:拷贝长度的时候,需要留一个字节存放字符串结尾符(,其ascii值为0)。
我们传入的文件的名字不到100个字节,结果每次copy的时候都固定copy1024个字节,肯定越界,不知道这代码谁写的。
修改成如下后,问题得到修改#define MAX_DRM_FILE_LENGTH 1024char* dst = new char[MAX_DRM_FILE_LENGTH];memset(dst, 0,MAX_DRM_FILE_LENGTH);if(dst == NULL) return;size_t file_len = strlen(s->file);size_t cpySize = (MAX_DRM_FILE_LENGTH>file_len ?file_len:MAX_DRM_FILE_LENGTH - 1);memcpy(dst, s->file,cpySize);
给出cplusplus上面对这个函数的介绍:
void * memcpy ( void * destination, const void * source, size_t num );
Copy block of memoryCopies the valuesofnumbytes from thelocation pointedbysourcedirectly to thememory block pointed bydestination.
memcpy strcpy memcpy

The underlying type of the objects pointed by boththesourceanddestinationpointersare irrelevant for this function; The result is a binary copy ofthe data.
二进制拷贝,源地址和目的地址存放的数据类型不需要考虑
The function does not check for any terminating null characterinsource- it alwayscopiesexactlynumbytes.
函数不考虑任何空字符,任何时候都copy num个字节
To avoid overflows, the size of the arrays pointed by boththedestinationandsourceparameters,shall be at leastnumbytes, and should notoverlap (for overlapping memory blocks,memmoveisa safer approach).安全考虑:源地址和目的地址都至少需要有num字节大小,且地址直接最好不要有重叠,有重叠的话用memmove更安全
例子:
*/memcpy example */
#include 
#include 
struct {
 char name[40];  int age;
}person, person_copy;
int main (){
  char myname[] = "Pierre de Fermat";
*/using memcpy to copy string*/
 memcpy ( person.name, myname, strlen(myname)+1 );
 person.age = 46;
*/using memcpy to copy structure:*/
 memcpy ( &person_copy, &person, sizeof(person) );
 printf ("person_copy: %s, %d n", person_copy.name, person_copy.age );
  return 0;
}
输出:
person_copy: Pierre de Fermat, 46

  

爱华网本文地址 » http://www.413yy.cn/a/25101016/286234.html

更多阅读

漏洞 — zergRush 漏洞扫描工具

tpadding_sz=(jumpsz==0?0:gadget_jumpsz-jumpsz);memset(padding,0,128);strcpy(padding,"LORDZZZZzzzz");if(padding_sz>0){memset(padding+12,'Z',padding_sz);printf("[*]Poping%dmorezerglings",paddi

《高质量程序设计指南》--strcpy 的实现 c语言实现strcpy函数

strcpy 看似是标准函数库里面最简单的函数了,谁都可以实现这个函数,但是,并不一定谁都能实现的很好。林锐博士面试微软的时候,就做这个题目。他也没有把这个题目完全的做对。建议你自己先动手写一个自己的,不要先看答案。估计有 90%的人

string.h 字符及字符串操作 string包含某个字符串

string.h目录简单介绍文件资料版本内容 1、C、传统 C++ 2、标准 C++ 3、C99 增加疑问解答 1、c++中 string与string.h 的作用和区别 2、c++ <string.h>中包括哪些函数?string.h文件中函数的详细用法 1、strcpy 2、strcat 3、strchr 4

ANSI字符和UNICODE字符 unicode转ansi 在线

ANSI和UNICODE(在软件开发中,特别是使用C语言的一些有关字符串处理的函数,ANSI和UNICODE是区分是用的,那么ANSI类型的字符和UNICODE类型的字符如何定义,如何使用呢?ANSI和UNICODE又如何转换呢?一.定义部分:ANSI: char str[1024]; 可用字符串

声明:《memcpy strcpy memcpy》为网友你这该死的温柔分享!如侵犯到您的合法权益请联系我们删除