【发布时间】:2023-03-07 03:18:02
【问题描述】:
使用以下代码:
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 范围的尝试似乎会在某些系统上触发分段错误。
这是遗留代码,易于纠正。但我想知道的是可能导致失败与否的潜在特征。 它与堆栈上的读取冲突有关吗?一些跨界? 它与内存分段有关,它是否只是偶然的情况(取决于内存管理和操作系统如何完成内存分段/分页。)它可能会失败。
【问题讨论】:
-
如果参数从未更改,则应考虑将其设为 const,以便更清楚地了解其生命周期。
-
不过,这与这种情况完全没有关系。