我有一个c程序,看起来像。
int indexLength;
char *args[1024];
while(args[indexLength])
indexLength++;如果我在工作的计算机上运行程序,while循环行给了我一个segfault..and,indexLength取了一些可笑的任意值。但是,如果我在家里的linux机器上运行该程序,就不会出现段错误,并且我的程序可以正常运行。
我能想到的两台机器之间唯一的区别是,工作的那台机器是gcc4.7 redhat版本,运行的是Fedora OS,而我家的机器是从ppa存储库下载的gcc4.7,运行的是ubuntu操作系统。但是,我不相信这是唯一的区别!那会是什么呢?
编辑:对不起,我忘了提了。如果我初始化indexLength =0,那么工作中的计算机上的段故障就消失了。
发布于 2013-05-22 20:52:18
从未初始化的内存中读取是未定义的行为。默认情况下,变量不会初始化,因此indexLength可以接受任何值,直到您为其赋值。由于行为未定义,程序可能会在某些机器上运行,而在其他机器上崩溃。
此外,即使将indexLength初始化为0也不能修复未定义的行为,因为args仍未初始化。这意味着程序可能不会在到达数组末尾时停止,并访问超过分配区域末尾的值。当然,为了做到这一点,1024个项的数组中的所有值都必须是非零的,所以在到达数组末尾之前停止的可能性是很大的。但是,为了修复这种未定义的行为,您需要在访问值之前检查索引。
发布于 2013-05-22 20:52:25
您的代码调用了未定义的行为
args未初始化,因此每个元素都包含不可预知的值。也许你会在下一个4k的堆栈中找到一个空指针并退出循环;也许你不会,你会在arrayindexLength结束后读取,所以你可能会在数组结束后读取immediatelyargs的读取效果也是不可预测的。这包括潜在的崩溃,例如,如果在达到process的可读内存限制之前没有找到一个零字
尽管最初的外观,设置indexLength=0实际上并没有使您的代码安全。您仍在读取未初始化的内存,因此依赖于在args中查找空元素。没有办法保证你会找到它。如果你的循环在数组末尾之前没有退出,你又回到了未定义的行为,所以你的程序可能会在任何进一步的迭代中崩溃。
https://stackoverflow.com/questions/16692242
复制相似问题