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

2つのこと:最初に、からの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 に答える