SIGABRT在fclose上?

时间:2012-09-12 16:50:18

标签: c

我无法正常运行某些C代码(如果这个问题很愚蠢,请耐心等待我,因为我是C的新手;另外,所有人都很清楚,这是我无法运行的代码。我写的只有部分是空文件句柄检查)。基本上,我的程序在fclose上崩溃了。代码优先:

位于文件顶部:

int *label;

特定方法:

void load_dat ()
{
  int    i, j, t, k;
  FILE   *in;
  char   t_file[16];

  printf ("\nName of Raw Data File > ");
  scanf ("%s", t_file);
  in = fopen (t_file, "r");
  if (in == NULL){
    perror("fopen error");
  }
 fscanf (in, "%d %d %d", &num_pats, &a_length, &b_length);

 dpt = (float **) malloc (sizeof(float *)*num_pats);

 for (k=0; k<num_pats; k++){
    dpt[k] = (float *) malloc (sizeof(float)*(a_length+b_length));
 }

 label = (int *) malloc (sizeof(int)*num_pats);

  for (i=0; i<num_pats; i++)
  {
      for (j=0; j<a_length; j++)
      {
        fscanf (in, "%f", &dpt[i][j]);
      }

  fscanf (in, "%d", &label[i]);


  if (label[i]<0 || label[i]>3)
    printf ("ERROR: Label corrupted.\n");

    for (t=0; t<b_length; t++){
        dpt[i][t+a_length] = 0.0;
        dpt[i][label[i]+a_length] = 1.0;
    }
  }
  fclose (in); 
}      

我的程序错误消息是:Abort trap: 6。谷歌搜索最终导致我使用GBD的建议,这给了我:

Program received signal SIGABRT, Aborted.

#0  0x00007fff8c12582a in __kill ()
#1  0x00007fff871a3b6c in __abort ()  
#2  0x00007fff871a0070 in __stack_chk_fail ()
#3  0x000000010000175f in load_dat ()
#4  0x0000000100001baa in main ()
#5  0x00000001000013e4 in start ()

如果我单步执行整个方法,程序不会崩溃,直到我到达最后一行fclose(in)。此外,整个计划中in的值保持不变。

使用fclose搜索问题,我遇到this SO post,这导致我尝试使用Valgrind,其输出(使用--leak-check=yes)是:

==22688== 
==22688== Process terminating with default action of signal 6 (SIGABRT)
==22688==    at 0x2DD82A: __kill (in /usr/lib/system/libsystem_kernel.dylib)
==22688==    by 0x18A06F: __stack_chk_fail (in /usr/lib/system/libsystem_c.dylib)
==22688==    by 0x10000175E: load_dat (in ./dataPre) 
==22688==    by 0x100001BA9: main (in ./dataPre)
==22688== 
==22688== HEAP SUMMARY:
==22688==     in use at exit: 28,781 bytes in 83 blocks
==22688==   total heap usage: 84 allocs, 1 frees, 32,877 bytes allocated
==22688== 
==22688== LEAK SUMMARY:
==22688==    definitely lost: 0 bytes in 0 blocks
==22688==    indirectly lost: 0 bytes in 0 blocks
==22688==      possibly lost: 0 bytes in 0 blocks
==22688==    still reachable: 28,781 bytes in 83 blocks
==22688==         suppressed: 0 bytes in 0 blocks
==22688== Reachable blocks (those to which a pointer was found) are not shown.
==22688== To see them, rerun with: --leak-check=full --show-reachable=yes
==22688== 
==22688== For counts of detected and suppressed errors, rerun with: -v
==22688== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
Abort trap: 6

在这一点上,我不知道在哪里看或做什么。

示例数据:

44  96  3                                                                                                                                                                                                                                                                                                                                                                                       
0   0   17.57298681 24.18012088 0   24.07599728 0   0   0   19.53417371 22.61467731 15.5650829  18.65720893 21.70631048 26.8811321  23.88086356 23.73544942 0   0   22.63088094 21.11777268 22.06847477 22.38688445 19.6794802  20.95594497 22.56472976 15.5058779  0   16.89366861 21.23974633 0   19.01608872 22.58492673 22.39564384 18.17000387 0   0   25.85404904 23.80483437 22.64271243 0   17.09819014 24.60634479 0   24.74696139 29.27117194 20.8931952  19.08648917 23.95167438 0   0   17.2386599  0   0   23.22304254 22.86712074 0   21.45687449 21.45146304 0   0   0   20.98717232 0   18.09871479 17.8226754  23.72508288 23.34563846 21.26201041 17.44038043 22.49848573 18.99848797 16.43222002 14.8132735  22.28093734 17.78931496 0   20.46914933 17.87742323 21.07936723 23.52102135 0   17.90498094 21.93199281 0   0   16.3020812  0   18.17972854 16.43234906 19.0756696  0   0   22.98048214 23.22184013 21.54024161 0

请注意,num_pats是指行数,a_length到列数。 b_length是不同输入类型的数量(每行的最后一个数字)。我的示例文件中有44行。

3 个答案:

答案 0 :(得分:4)

加载到t_file中的字符串大小是多少?你只在那里分配16个字节...

答案 1 :(得分:0)

您没有对“num_pats”进行任何验证。

如果fscanf由于某种原因失败,num_pats可能等于零或为负值,这将导致您堕胎。

答案 2 :(得分:0)

几乎可以肯定,问题是由写入未分配的内存引起的。涉及FILE *in的操作看起来很好。

然而,你在管理动态内存方面有相当多的复杂性(更不用说新手了 - 即使对于高级C程序员来说这也是复杂的代码)。由于没有对失败的分配和输入的有效性进行验证检查,这些分配中的一个可能是在分配结束时:分配不够大,或者取消引用的方式与原始分配不匹配,使用演员表时的问题。这样的写法显然会导致FILE *in中的某些内容在最终被调用时导致fclose()崩溃。问题发生在fclose()之前很久。

如果您包含导致其崩溃的样本输入数据,那么我应该明白出现了什么问题。