2015-02-12 70 views
0

我在我正在运行的程序上运行valgrind,并且出现以下错误 - 我找不到原因。任何帮助将不胜感激提前。让我知道如果你需要更多的信息 从标准输入输入的问题 - 从valgrind无效读取/写入

==27928== Invalid read of size 1 
==27928== at 0x4EB9390: __GI___rawmemchr (rawmemchr.S:25) 
==27928== by 0x4EA514F: _IO_str_init_static_internal (strops.c:45) 
==27928== by 0x4E86D64: __isoc99_vsscanf (isoc99_vsscanf.c:42) 
==27928== by 0x4E86CF7: __isoc99_sscanf (isoc99_sscanf.c:33) 
==27928== by 0x401A76: countAndSort (lab1.c:442) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== Address 0x55bb040 is 0 bytes inside a block of size 10,000,000 free'd 
==27928== at 0x4C27D4E: free (vg_replace_malloc.c:427) 
==27928== by 0x4019D6: countAndSort (lab1.c:430) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== 
==27928== Invalid read of size 1 
==27928== at 0x4C2B834: __GI___rawmemchr (mc_replace_strmem.c:1110) 
==27928== by 0x4EA514F: _IO_str_init_static_internal (strops.c:45) 
==27928== by 0x4E86D64: __isoc99_vsscanf (isoc99_vsscanf.c:42) 
==27928== by 0x4E86CF7: __isoc99_sscanf (isoc99_sscanf.c:33) 
==27928== by 0x401A76: countAndSort (lab1.c:442) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== Address 0x55bb041 is 1 bytes inside a block of size 10,000,000 free'd 
==27928== at 0x4C27D4E: free (vg_replace_malloc.c:427) 
==27928== by 0x4019D6: countAndSort (lab1.c:430) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== 
==27928== Invalid read of size 1 
==27928== at 0x4E7D920: _IO_vfscanf (vfscanf.c:620) 
==27928== by 0x4E86D79: __isoc99_vsscanf (isoc99_vsscanf.c:44) 
==27928== by 0x4E86CF7: __isoc99_sscanf (isoc99_sscanf.c:33) 
==27928== by 0x401A76: countAndSort (lab1.c:442) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== Address 0x55bb040 is 0 bytes inside a block of size 10,000,000 free'd 
==27928== at 0x4C27D4E: free (vg_replace_malloc.c:427) 
==27928== by 0x4019D6: countAndSort (lab1.c:430) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== 
==27928== Invalid read of size 1 
==27928== at 0x4EA36D2: _IO_sputbackc (genops.c:731) 
==27928== by 0x4E7D97B: _IO_vfscanf (vfscanf.c:625) 
==27928== by 0x4E86D79: __isoc99_vsscanf (isoc99_vsscanf.c:44) 
==27928== by 0x4E86CF7: __isoc99_sscanf (isoc99_sscanf.c:33) 
==27928== by 0x401A76: countAndSort (lab1.c:442) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== Address 0x55bb040 is 0 bytes inside a block of size 10,000,000 free'd 
==27928== at 0x4C27D4E: free (vg_replace_malloc.c:427) 
==27928== by 0x4019D6: countAndSort (lab1.c:430) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== 
==27928== Invalid read of size 1 
==27928== at 0x4E7DC7D: _IO_vfscanf (vfscanf.c:1394) 
==27928== by 0x4E86D79: __isoc99_vsscanf (isoc99_vsscanf.c:44) 
==27928== by 0x4E86CF7: __isoc99_sscanf (isoc99_sscanf.c:33) 
==27928== by 0x401A76: countAndSort (lab1.c:442) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== Address 0x55bb040 is 0 bytes inside a block of size 10,000,000 free'd 
==27928== at 0x4C27D4E: free (vg_replace_malloc.c:427) 
==27928== by 0x4019D6: countAndSort (lab1.c:430) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== 
==27928== Invalid read of size 1 
==27928== at 0x4E7E9EF: _IO_vfscanf (vfscanf.c:1781) 
==27928== by 0x4E86D79: __isoc99_vsscanf (isoc99_vsscanf.c:44) 
==27928== by 0x4E86CF7: __isoc99_sscanf (isoc99_sscanf.c:33) 
==27928== by 0x401A76: countAndSort (lab1.c:442) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== Address 0x55bb041 is 1 bytes inside a block of size 10,000,000 free'd 
==27928== at 0x4C27D4E: free (vg_replace_malloc.c:427) 
==27928== by 0x4019D6: countAndSort (lab1.c:430) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== 
==27928== Invalid read of size 1 
==27928== at 0x4EA36D2: _IO_sputbackc (genops.c:731) 
==27928== by 0x4E7DDF3: _IO_vfscanf (vfscanf.c:1811) 
==27928== by 0x4E86D79: __isoc99_vsscanf (isoc99_vsscanf.c:44) 
==27928== by 0x4E86CF7: __isoc99_sscanf (isoc99_sscanf.c:33) 
==27928== by 0x401A76: countAndSort (lab1.c:442) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== Address 0x55bb041 is 1 bytes inside a block of size 10,000,000 free'd 
==27928== at 0x4C27D4E: free (vg_replace_malloc.c:427) 
==27928== by 0x4019D6: countAndSort (lab1.c:430) 
==27928== by 0x4014EB: doProcess (lab1.c:316) 
==27928== by 0x4011C2: main (lab1.c:211) 
==27928== 

不管你怎么想从每个错误的根源,通过大量的试验和错误,注释掉/后的代码块,并分别测试件代码在测试编译中,我发现以下是错误的来源。如果我在我的程序中注释此代码,所有错误都会消失。

注意:整数是全局int *类型。 countToUse是一个全局的int类型。这里的代码的目标是从标准输入读取所有整数,并将它们放入正确大小的动态数组中。

  // Load stdin into a buffer 
      char *buffer = malloc(BUFFER_SIZE); 
      if(buffer == NULL){ 
        fprintf(stderr, "Malloc for stdin buffer in countAndSort() failed. Exiting.\n"); 
        exit(1); 
      } 
      if (fgets(buffer, BUFFER_SIZE, stdin) == NULL) { 
        fprintf(stderr, "Error loading input from stdin into buffer. Exiting.\n"); 
        exit(1); 
      } 

      // Get a count of the numbers to create the array 
      int count = 0; 
      int index = 0; 
      int num, delta; 
      while (index < BUFFER_SIZE && sscanf(&buffer[index], "%d%n", &num, &delta) == 1){ 
        count++; 
        index += delta; 
      } 

      // Initialize the array with the proper size 
      integers = malloc(count*sizeof(int)); 
      if(integers == NULL){ 
        fprintf(stderr, "Malloc for integer array in countAndSort() failed. Exiting. \n"); 
        exit(1); 
      } 

      // Load the integers into the array 
      index = 0; 
      for (int i = 0; i < count; i++){ 
// LINE 442 IS RIGHT BELOW THIS LINE ------------------------------------ 
        if (index < BUFFER_SIZE && sscanf(&buffer[index], "%d%n", &integers[i], &delta) != 1){ 
          fprintf(stderr, "There was a problem reading the buffer!\n"); 
          exit(1); 
        } 
        index += delta; 
      } 

      if(buffer != NULL) 
        free(buffer); 

      countToUse = count; 
+0

'doProcess()' – Cyclonecode 2015-02-12 01:09:18

+0

@Cyclone它不是由doProcess引起的。我已经排除了。 doProcess(在第323行)调用包含此代码的函数(countAndSort)。 – JayB 2015-02-12 01:09:49

+0

@Cyclone在计数进程中的第323行读取“countAndSort()” – JayB 2015-02-12 01:11:04

回答

1

你需要确保你不读超出buffer界限,这样

while ((index < 10000000) && (sscanf(&buffer[index], "%d%n", &num, &delta) == 1)) 

这同样适用于所有的buffer[index]的。

此外,从错误似乎你有free() d buffer然后试图从它读取。

+0

我已经做了这些修改,同样的错误仍然存​​在 – JayB 2015-02-12 01:27:02