堆栈内存读取

1 c stack

使用以下代码:

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()触发器分割故障在某些系统上.

它是遗留代码,易于纠正.但我想知道的是可能导致这种失败与否的潜在特征.它与堆栈上的读取违规有关吗?有些过境?它与内存分段有关,它只是偶然的一种情况(取决于内存管理和操作系统如何完成内存分段/分页),它可能会失败.

Nil*_*nck 5

你已经敲了敲头:

在你的memcpy中,你正在读取文件名的长度.

如果文件名后面的内存可读,那么通常也会很脏.在大多数情况下它是,但是如果您例如传递一个字符串文字作为参数,并且链接器将字符串放入数据部分的最后一个千字节,您将得到一个分段错误,因为CPU尝试从内存中读取未映射到进程地址空间的位置.

显而易见的解决方法是使用strcpy或strncpy.