我最近继承了用 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);
}
该函数用于判断一个子串是否在字符串开始
之前一定距离。例如,字符串 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 而言,没有办法,对于许多平台也是如此(例如,刚释放的内存通常与仍在分配的内存无法区分)。
关于c - while 循环条件中大小为 1 的读取无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54893473/