我该如何处理segfault?C语言



假设我们有一项任务要编写一个添加2个数字的函数。

#include <stdio.h>
int main(int argc, char ** av) {
int a = atoi(av[1]);
int b = atoi(av[2]);
add_and_print(a, b)
return 0;
}

它工作良好,直到我通过以下代码:

./a.out

只是传递空字符串。然后它写下以下内容:

1495 segmentation fault (core dumped)

你能解释一下问题出在哪里吗?我该怎么处理?

argc包含提供给程序的参数数量,如果不检查它,则可能会在尝试从argv读取时出现segfault。如果没有足够的参数,您可以显示错误消息并退出:

if (argc < 3) {
puts("Please provide 2 numbers as command line arguments.");
return 1;
}

如何处理segfault

segfault的发生是因为代码中的一个错误。

因此,通过不编写有缺陷的代码,您可以从一开始就防止这种情况的发生。

不过,一般来说,segfault可以很容易地找出到底是什么错误触发了它:只需在调试器下运行程序,它就会在segfault发生的地方停止。

你能解释一下的问题吗

在此代码中:

int a = atoi(av[1]);

表达式CCD_ 3只有在数组CCD_。如果只有一个元素,则此代码将尝试读取超出数组末尾的内容。

由于数组基于命令行参数,您必须检查。您需要对来自用户、文件甚至您自己代码的其他部分的所有输入执行此操作。不要只是假设用户做了你所期望的事情(或者文件包含了你所期待的,或者调用者传递了正确的值(。这是一个bug。

if (argc >= 2) {
// now it is safe to refer to av[1]
a = atoi(av[1]);
}

出于同样的原因,您必须对av[2]执行类似的操作。

一个常见的解决方案可能是

int main(int argc, char **argv) {
if (argc < 3) {
printf("Syntax: %s a bn"
"n"
"Two integer arguments are required.", argv[0]);
return -1;
}
int a = atoi(argv[1]);
int b = atoi(argv[2]);
add_and_print(a, b)
}

我只是假设argc至少是1,而argv[0]是程序的名称。如果您想要完全可移植的代码,也可以检查此项。

请注意,您可能还想检查参数是否真的是整数。

最新更新