这是不好的编码练习吗?

时间:2011-01-07 07:11:47

标签: c ansi

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

看起来如何?

2 个答案:

答案 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目标缓冲区有多大,那么您应该这样做(或修复一些事情以便您知道缓冲区有多大)。它会更清楚代码实际上在做什么。