0

以下は、パイプからの読み取り関数からのコードスニペットです。これは正しく実行され、データがバッファに取り込まれることを確認します。

int readFrom(char *buffer)
{
int nread;

if((nread = read(readfd,buffer,100)) < 0)
{
    printf("\nerror in reading data from FIFO\n");
    return(-1);
}
buffer[nread]='\0';
return(0);
}

上記の例では、nreadは100未満です。GCC-4.7.0を使用しています。

以下のような上記の関数の抽象化レイヤーがありました:

int pipe_input(char *parmPtr, int size)
{

char readMsg[100];


if( readFrom((char *)&readMsg) == -1)
  return ERROR;

if (strlen(readMsg) < 1)
{
    printf("Incorrect Input\n");
    return ERROR;
}
strncpy(parmPtr, readMsg, ((size < 100)?size:100));


return 0;

}

上記の関数でも、読み取りメッセージが適切であり、parmptrに値が適切にロードされていることが確認されました。しかし、pipe_inputを呼び出そうとしている関数では、sigsegvを取得しています。これはGCC-4.7.0で発生しますが、GCC-4.2.4でコンパイルされた同じコードは正常に実行されます。警告を確認しましたが、上記の警告はありません。どんなポインタも非常に役に立ちます。

以下のpipe_inputを呼び出すためのコードスニペット:

int Calling_func(void)
{
  char alpha[100] ;

  pipe_input(alpha,100);
  printf("alpha value is %s \r\n",alpha);
}

printステートメントでsigsegvを取得します。

4

1 に答える 1

2

コードに1つずつエラーがあります。配列には100個の要素がありますが、NULL終了を考慮していません。

strncpy(parmPtr, readMsg, ((size < 100)?size:100));

と:

buffer[nread]='\0';

最後の要素はbuffer[99](配列インデックスは1ではなく0から始まるため)ですが、に書き込むことができますbuffer[100]。これにより、セグメンテーション違反が発生する可能性があります。

代わりに、サイズが101のすべての配列を宣言して、それが役立つかどうかを確認する必要があります。Linuxを使用している場合は、Valgrindでもプログラムを実行する必要があります。セグメンテーション違反がどのように発生したかを正確に知ることができます。

于 2012-12-13T18:19:58.417 に答える