strtol 导致 raspberry pi 3 b+ 上出现分段错误

strtol resulting in a segmentation fault on the raspberry pi 3 b+

我的问题是 strtol 不起作用,导致我的 C 程序崩溃。我正在使用 Raspberry Pi 3 b+ 但这可能无关紧要。

我的程序(这是一个控制移位寄存器的命令行工具)使用 strtol 来解析程序获取的命令行参数。

这是我得到的输出:fish: Job 2, “./a.out -p 16 -w 0xff” terminated by signal SIGSEGV (Addroundary error)

这里是 gdp 的输出:

Program received signal SIGSEGV, Segmentation fault.
__GI_____strtol_l_internal (
    nptr=0x76f72968 <_nl_C_LC_CTYPE_toupper+512> "", 
    nptr@entry=0x7efff6e9 "16", endptr=0x7efff6e9, 
    base=<optimized out>, group=group@entry=0, 
    loc=0x76fa1c70 <_nl_global_locale>) at strtol_l.c:484
484     strtol_l.c: No such file or directory.

代码如下:

else if(!strcmp(argv[arg], "-p") || !strcmp(argv[arg], "-pins")) {
     if(argc <= arg+1)
         return 1;

     pins = strtol(argv[++arg], endptr, 0);
}

命令行参数解析是这样的:

uint8_t arg, pins;
char **endptr;
uint64_t writeValue;
bool valueGiven; // The other bools that I define are irrelevant

for(arg = 1; arg < argc; arg++) {
    if(!strcmp(argv[arg], "-w") || !strcmp(argv[arg], "-write")) {
        if(argc <= arg+1)
            return 1;

        writeValue = strtol(argv[++arg], endptr, 0); // error happens here too

        valueGiven = true;
    }

    else if(!strcmp(argv[arg], "-p") || !strcmp(argv[arg], "-pins")) {
        if(argc <= arg+1)
            return 1;

        pins = strtol(argv[++arg], endptr, 0);
    }

    // There are more arguments but those are irrelevant
}

而我运行程序是这样的:./a.out -p 16 -w 0xFF

这个错误对于之前工作的完全相同的东西来说非常奇怪,这可能是数据损坏的情况吗?

您的 char **endptr 未初始化。它需要指向将存储第一个未转换字符的地址的 char * 。相反,你的指向任何地方,所以 strtol 将尝试写入它指向的任何虚假内存位置,并且很可能会崩溃。

如果启用 -Wall,GCC 和 clang 都应该发出关于未初始化变量的警告。 Example。始终使用编译器警告,不要忽略它们!

通常你会声明一个 char * 变量并传递它的地址:

char *end;
strtol(argv[++arg], &end, 0);