最后定为到一个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.
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