c - 栈内存读取

标签 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 );
...
...

调用该函数时,它在 SPARC 机器上运行正常,但在运行 Solaris 10 的 i386 上出现段错误。 fileName 是一个以 nul 结尾的字符串,假设有 30 个字符。 似乎使用 memcpy() 读取超出 fileName 范围的尝试会在某些系统上触发段错误。

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

最佳答案

您已经一针见血了:

在您的 memcpy 中,您正在读取超过文件名的长度。

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

明显的解决方法是使用 strcpy 或 strncpy。

关于c - 栈内存读取,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/190738/

相关文章:

c - 将sqlite3 db数据读入uint64_t

c - 未获得预期输出 - 查找单词的所有子词

loops - FFMPEG vstack 和循环

c++ - glGetFloatv 导致堆栈粉碎

java - 索引越界异常(堆栈)

VB.NET 设计器错误 : How to (correctly) inherit form that inherits form?

c++ - 链表堆栈复制构造函数 C++

c - 了解 gdb 格式

c - 如何使用 fscanf 将大量输入从文件中提取到结构中。美标 C89(90)

c++ - c 引用语义在调用者代码中不明确