1

我正在使用 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);
    }
  }

看起来怎么样?

4

2 回答 2

3

两件事:首先你不处理 NULL 返回strchr

其次(更严重的是),您传递给的长度strlcpy是错误的:您想要end - start或类似的东西(您已经颠倒了),但更根本的是,长度参数strlcpy应该是目标缓冲区的大小,而不是源字符串。

于 2011-01-07T08:06:58.010 回答
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目标缓冲区有多大,您应该这样做(或修复一些问题,以便您知道缓冲区有多大)。代码实际上在做什么会更清楚。

于 2011-01-07T07:56:56.287 回答