在while循环条件下无效读取大小1

时间:2019-02-26 20:20:26

标签: c valgrind

我最近继承了用C编写的代码,没有任何文档。我一直在优化和修复它,并且遇到了这个问题。

int  LookBack(char * Start, int Length, char *Ignore)
{
  char  LookBuffer[10];
  //while(Start[-1] && Length--) Start--; // Start[-1]. No idea what that is supposed to mean.
  while(Length > 0 && Start[0]){
    Start--;
    Length--;
  }
  strncpy(LookBuffer, Start, sizeof(LookBuffer));
  if(strcasestr(LookBuffer, Ignore)) {
    return(1);
  }
  return(0);
}

此函数用于确定子字符串是否在字符串Start前面一定距离。例如,使用字符串The designation is API RP 5L1,而Start是指向API RP 5L1的指针。因此,如果Ignore = "The"Length = 10,该函数将返回0

我的问题

Valgrind给我一个Invalid read of size 1错误,因为它正在读取while(Length > 0 && Start[0])上分配的内存,或者我相信。有什么方法可以检查Start[0]是否在分配的内存中而不进行无效读取?

2 个答案:

答案 0 :(得分:2)

对于使用内存缓冲区的C函数,调用者有责任传递有效的指针。可能有一些特定于平台的技巧,但是就标准C而言,对于许多平台,这是没有办法的(例如,刚释放的内存通常与仍分配的内存没有区别)。

答案 1 :(得分:1)

该函数称为LookBack,因此似乎在类似于strtok()的某些字符串处理/标记化过程中调用了该函数,该函数在拆分点处插入了\0

while(Start[-1] && Length--) Start--; 如果它不是\0字符串终止符,请查看Start [0]之前的位置。如果不是\0,请返回一个。

while( (*(Start-1) != '\0') && (0 != (Length--))) Start--;

因此,在while循环之后,您实际上在Start指针传递的字符串中获得了一个“ start”指针,而没有对其进行+1调整而实际上获得了第二个字符串部分。

在替换中,您实际上错过了向后移动Start指针的过程,因为现在它指向一个\0,该字符串结束一个字符串,因此您的字符串函数将只看到strlen(Start)= 0。