strtol 导致 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],0); // error happens here too

        valueGiven = true;
    }

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

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

    // There are more arguments but those are irrelevant
}

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

对于之前工作过的完全相同的事情,这个错误很奇怪,这可能是数据损坏的情况吗?

解决方法

您的 exports.confirmEmail = function (req,res) { ConfirmToken.findOne({ token: req.params.token },function (err,token) { if (err) { return res.status(500).send({ message: "Internal Server Error " + err }) } // token is not found into database i.e. token may have expired if (!token) { return res.status(400).send({ message: 'Your verification link may have expired. Please click on resend for verify your Email.' }); } // if token is found then check valid user else { Account.findOne({ _id: token._accountId,email: req.params.email },user) { if (err) { return res.status(500).send({ message: "Internal Server Error " + err }) } // User does not exist if (!user) { return res.status(401).send({ message: 'The account does not exist' }); } // user is already verified else if (user.isVerified) { return res.status(200).send('User has been already verified. Please Login'); } // verify user else { // change isVerified to true user.isVerified = true; user.save(function (err) { // error occur if (err) { return res.status(500).send({ message: err.message }); } // account successfully verified else { return res.status(200).send('Your account has been successfully verified'); } }); } }); } }) } 未初始化。它需要指向一个 char **endptr,其中将存储第一个未转换字符的地址。相反,您的指向无处可去,因此 char * 将尝试写入它指向的任何虚假内存位置,并且很可能会崩溃。

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

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

char *