我正在使用PC-lint来分析我的代码,而且这些行产生了一些错误。这让我想知道我的编码实践是否错误?
char *start;
char *end;
// Extract the phone number
start = (char*) (strchr(data, '\"') +1);
end = (char*) strchr(start, '\"');
*end = 0;
strlcpy((char*)Fp_smsSender, start , start-(end-1));
编辑: 在你的帮助之后,我现在有:
char *start;
char *end;
if (data != NULL)
{
// Extract the phone number
start = strchr(data, '\"');
if (start != NULL)
{
++start;
end = strchr(start, '\"');
if (end != NULL)
{
*end = 0;
strlcpy((char*)Fp_smsSender, start , FP_MAX_PHONE);
}
}
看起来如何?
答案 0 :(得分:3)
两件事:首先你不处理来自strchr
的NULL返回。
第二个(也是更严重的),传递给strlcpy
的长度是错误的:你会想要end - start
或类似的东西(你有相反的东西),但更重要的是,{{}的长度参数{1}}应该是目标缓冲区的大小,而不是源字符串。
答案 1 :(得分:1)
我认为lint抱怨的是strchr()
可能返回一个NULL指针,并且在执行指针算法和解除引用之前你没有检查它。
您可能想要执行以下操作:
char *start;
char *end;
// Extract the phone number
start = strchr(data, '\"');
if (!start) handle_error();
++start; // skip the '\"'
end = strchr(start, '\"');
if (!end) handle_error();
*end = 0;
strlcpy((char*)Fp_smsSender, start, size_of_Fp_smsSender_buffer);
请注意,我将最后一个参数更改为strlcpy()
调用 - 该参数的用途是指定目标缓冲区的大小,以免过度运行。你传递的价值根本就没有意义,而且lint也可能抱怨这一点。您可能认为end-(start-1)
可能更简单地说明为strlen(start)+1
。
无论如何,即使将strlen(start)+1
作为strlcpy()
的最后一个参数传递也违反了参数的意图,并删除了应该提供的安全strlcpy()
。您也可以简单地使用strcpy(Fp_smsSender,start)
- 如果您不知道Fp_smsSender
目标缓冲区有多大,那么您应该这样做(或修复一些事情以便您知道缓冲区有多大)。它会更清楚代码实际上在做什么。