题
我正在使用PC-LINT来分析我的代码,而TheEse线正在生成多个错误。这让我想知道我的编码pratice是否错了?
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);
}
}
看起来如何?
解决方案
我想皮草在抱怨的是 strchr()
可能会返回无效指针,并且在执行指针算术并将其删除之前,您不会检查它。
您可能想做类似的事情:
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
目标缓冲区是,您应该做到这一点(或修复事情,以便您知道缓冲区的大小)。更清楚代码实际在做什么。
其他提示
两件事:首先,您不处理无效返回 strchr
.
第二(更严重),您经历的长度 strlcpy
是错误的:你想要 end - start
或类似的东西(您有反转),但从根本上讲,长度论证 strlcpy
应该是 目的地 缓冲区,而不是源字符串。
不隶属于 StackOverflow