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