while 循环条件中大小为 1 的读取无效

Invalid read of size 1 in while loop condition

我最近继承了用 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 5L1Start 是指向 API RP 5L1 的指针。所以,如果 Ignore = "The"Length = 10,函数将 return 0.

我的问题

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

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

该函数被调用LookBack,所以它似乎是在一些类似于strtok()的字符串处理/标记化过程中调用的,它在分割点插入一些[=11=]

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

while( (*(Start-1) != '[=15=]') && (0 != (Length--))) Start--;

因此,在 while 循环之后,您实际上在 Start 指针传递的字符串中得到了一个 "start" 指针,而无需将其重新调整 +1 以实际获取第二个字符串部分。

在你的替换中,你实际上错过了之后推进 Start 指针,因为现在它指向一个 [=11=],它结束了一个字符串,所以你的字符串函数只会看到一个字符串 strlen(Start ) = 0.