2017-06-16 20 views
2

私はC言語には新しく、学習を促す助けとしてプロジェクトを進めています。私はsh popenからの出力を得るのに苦労していました。彼らはstrcpyがこのような状況でどのように動作するのかわからない

strcpy(str + size - 1,buf); 

を使用ところずっと、検索や裁判の時間後、私は非常に古いポストに出くわしこれは私が見つけることができるし、それが働いているこのの最初で唯一の例でした。 strの最後にある終了文字をbufの内容で上書きするようです。それは安全ですか?私はまだこのデータのすべてをどのように格納しているのかを把握しておらず、最後にその番号を+2以上に変更すると、セグメンテーションフォルトまたは無効な次のサイズが発生します。完全なコードは次のとおりです

int dns_probe(char * hostname) 
{ 
    char * digLoop[4] = {"ns ","a ","cname ","mx "}; 
    int i; 
    char outage[1]; 
    char *str = NULL; 
    char *temp = NULL; 
    unsigned int size = 1; 
    unsigned int strlength; 

    for (i = 0; i < 4; i++) 
    { 
     char *digcmd = concatCMD(digLoop[i],hostname); 

     FILE * dig = popen(digcmd,"r"); 
     char bufer[256]; 
     while(fgets(buf,sizeof(buf),dig) != 0){ 

      strlength = strlen(buf); 

      temp = realloc(str, size + strlength); 
      str = temp; 

      strcpy(str + size - 1,buf); 
      size += strlength; 
     } 

     pclose(dig); 
     free(digcmd); 

    } 
    printf("%s",str); 
} 

実際には、私は自分自身を道路の下に問題を設定していないことを確認したいですか?

+0

あなたは 'temp = realloc()'と 'str = temp'の間でエラーをチェックして、わかりやすくするためにそれを削除したと思いますか?それ以外の場合は、NULLポインタを使用して書き込むことができます。 –

答えて

1

realloc()は、バッファが十分に大きい(とそうである)ことを保証している限り、これは安全です。

realloc()あなたが持つかもしれない前に:その後temprealloc()は長さ4 + = 7~3作させるだろう

strlength = strlen("bar") = 3 

 +---+---+---+----+ 
buf: | f | o | o | \0 | size=4 
    +---+---+---+----+ 

をするようそれでは、"bar"が読み取られたと仮定しましょう

 +---+---+---+----+---+---+---+ 
temp: | f | o | o | \0 | ? | ? | ? | 
     +---+---+---+----+---+---+---+ 

次にbuftempに設定されています(NULL -checks、btw)。

最後に、我々strcpy()"bar"buf + 4 - 1に、すなわちbuf[3]

 +---+---+---+---+---+---+----+ 
buf: | f | o | o | b | a | r | \0 | 
     +---+---+---+---+---+---+----+ 

は明らかに、このバッファがタッチされた前と同じサイズ、およびバッファ外の文字なしです。 STRの

+0

さて、tempのrealloc()は、str = tempのときに持ち越されます。これは大変ありがとうございます。 (これをupvoteするのに十分な担当者ではない) –

0
 `temp = realloc(str, size + strlength);` 

// bufが長さ(サイズ+ strlength)に再割り当てされ、その後、複数のバイトを、新たに割り当てられ、これに書き込まれます。最初の長さが1の場合、strのバッファはここでは安全です。 しかし、より安全なstrcpyを強くお勧めします。

ここでは、https://www.tutorialspoint.com/c_standard_library/c_function_strcpy.htmを学ぶことができます。

関連する問題