使用以下代码:
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
是一个以 nul 结尾的字符串,假设有 30 个字符。
似乎使用 memcpy()
读取超出 fileName
范围的尝试会在某些系统上触发段错误。
这是遗留代码,很容易纠正。但我想知道的是可能导致这种失败与否的潜在特征。 它与堆栈上的读取违规有关吗?一些边界穿越? 它与内存分段有关,是否只是偶然情况(取决于内存管理和操作系统如何完成内存分段/分页。)它是否会失败。
最佳答案
您已经一针见血了:
在您的 memcpy 中,您正在读取超过文件名的长度。
如果文件名后面的内存是可读的,也很脏,通常会起作用。在大多数情况下是这样,但是如果您例如传递一个字符串文字作为参数,并且链接器将字符串放入数据部分的最后千字节,您将遇到段错误,因为 CPU 试图从内存中读取未映射到进程地址空间的位置。
明显的解决方法是使用 strcpy 或 strncpy。
关于c - 栈内存读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190738/