GCC 4.7.0运行时问题 - 接收信号11(SigSegv)

时间:2012-12-13 17:45:17

标签: c signals posix

以下是我从管道函数读取的代码片段。这样可以正确执行并验证数据是否已进入缓冲区。

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正确加载了该值。但在函数Where我试图调用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);
}

在打印声明中获取sigsegv。

1 个答案:

答案 0 :(得分:2)

您的代码中有一个错误的错误。你的数组有100个元素,但是你没有考虑NULL终止:

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

buffer[nread]='\0';

最后一个元素是buffer[99](因为数组索引从0开始,而不是1),但您可以写入buffer[100]。这可能会导致段错误。

您应该声明所有大小为101的数组,看看它是否有帮助。如果你在Linux上,你也应该在Valgrind中运行你的程序;它可以准确地告诉你segfault是如何发生的。