当前位置:  开发笔记 > 编程语言 > 正文

堆栈内存读取

如何解决《堆栈内存读取》经验,为你挑选了1个好方法。

使用以下代码:

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

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



1> Nils Pipenbr..:

你已经敲了敲头:

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

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

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

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有