我最近继承了用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]
是否在分配的内存中而不进行无效读取?
答案 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。