我正在尝试确定特定的给定 C 语言源代码是否运行在统一操作系统可以想象,我可能会导致崩溃,以及通过什么向量。代码的某些部分有时会尝试取消引用空指针、访问但不写入越界的数组索引以及使用可能未初始化的变量。
该行为是未定义的,因此在 C 中是不可预测的,但根据我读过的其他讨论,操作系统和/或 CPU 在此类情况下将具有默认行为。
我不拥有有问题的代码,我也不想修复它。我只是想从高层次上了解这些(以及哪些)是否有合理的可能性导致程序崩溃。
答案1
我将尝试从总体上解决您的每种情况;我不是 Unison OS 方面的专家。
尝试取消引用空指针
如果程序取消引用 NULL 指针,则进程应该收到一个SIGSEGV
.
访问但不写入超出范围的数组索引
这取决于进程是否可以读取结果地址。只要结果地址对于读取“有效”,尝试读取该值就会在给定地址获取适当数量的字节。如果它离开数组末尾“足够远”,达到地址不再有效的程度,那么进程应该收到一个SIGSEGV
.
使用可能未初始化的变量
从内存中读取字节会返回最后存储在这些字节中的值。如果您的程序有一个未初始化的堆栈分配变量,然后尝试读取该变量,它将获得最后写入这些字节的任何内容。