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

问题描述 投票:0回答:2

我最近继承了用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,该函数将返回0

我的问题

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

c valgrind
2个回答
2
投票

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


1
投票

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

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

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

因此,在while循环之后,实际上在Start指针传递的字符串中得到一个“start”-pointer,而没有通过+1重新调整它来实际获得第二个字符串部分。

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

© www.soinside.com 2019 - 2024. All rights reserved.