我最近继承了用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]
是否在分配的内存中而不进行无效读取?
对于使用内存缓冲区的C函数,传递有效指针是调用者的责任。可能存在一些特定于平台的技巧,但就标准C而言,没有办法,以及许多平台(例如,刚刚释放的内存通常与仍然分配的内容无法区分)。
该函数被称为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的字符串。