使用以下代码:
typedef struct { char fileName[ 1024]; time_t deleteTime; } file_item_t; .... .... setEntry(char *fileName) { file_item_t file; memset( &file, 0x00, sizeof( file_item_t )); memcpy( file.fileName, fileName, sizeof( file.fileName ) - 1 ); ... ...
当调用该函数时,它在SPARC机器上运行正常,但运行Solaris 10的i386上的段错误
fileName
是一个以字符为终止的字符串,大概有30个字符.看来,试图超越的读取范围内fileName
使用memcpy()
触发器分割故障在某些系统上.
它是遗留代码,易于纠正.但我想知道的是可能导致这种失败与否的潜在特征.它与堆栈上的读取违规有关吗?有些过境?它与内存分段有关,它只是偶然的一种情况(取决于内存管理和操作系统如何完成内存分段/分页),它可能会失败.
你已经敲了敲头:
在你的memcpy中,你正在读取文件名的长度.
如果文件名后面的内存可读,那么通常也会很脏.在大多数情况下它是,但是如果您例如传递一个字符串文字作为参数,并且链接器将字符串放入数据部分的最后一个千字节,您将得到一个分段错误,因为CPU尝试从内存中读取未映射到进程地址空间的位置.
显而易见的解决方法是使用strcpy或strncpy.