插入排序的Valgrind Invalid读取尺寸8的尺寸

Valgrind Invalid Read of Size 8 for insertion sort

本文关键字:Invalid Valgrind 插入排序 读取      更新时间:2023-10-16

我正在尝试执行一个非常简单的代码,但是我一直遇到valgrind错误。

double s[4];
double aux;
unsigned int i, j;
for(i = 0; i < 4; i++) {
  aux = 5.0; // there is actually a function returning a value here
  for(j = i-1; j >= 0 && s[j] > aux; j--) s[j+1] = s[j];
  s[j+1] = aux;
}

这是一个简单的减少插入排序,但是我不断获得分割故障(Vaulgrind上的8个读数为8(

请注意, ij unsigned 类型。因此,您的j循环充满了问题:

i为0:

  • 循环始于(unsigned)-1(,即 UINT_MAX(
  • j >= 0始终是正确的
  • s[j]在有效缓冲区外访问(这可能是导致valgrind错误的原因(

在任何迭代中:

  • j--最终将包装到UINT_MAX,如果s[j] > aux从不false

简单地使用签名的整数作为您的数组索引,或在使用无符号索引的反向循环中更加谨慎,应解决您的问题。