我正在使用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 应该是 目的地 缓冲区,而不是源字符串。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top