问题描述
我有一个问题,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 *