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

标签 c valgrind

我最近继承了用 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 5L1Start 是指向 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/

相关文章:

c - 为什么我们在结构数组中使用点运算符 (.) 而不是箭头运算符 (->) 作为函数参数?

c++ - libssh:简单实现中丢失的内存

c++ - 有人可以用 open mpi 解释这个 valgrind 输出吗?

c++ - valgrind堆总结理解

c - Valgrind 对写入的未初始化值大喊大叫

您可以使用 gdb(或其他工具)从核心文件中找到内存泄漏吗?

c - 不兼容的类型 struct* 和 struct,

将 HTML 页面转换为十六进制值数组以在 Arduino 服务器中使用

c - 为什么此代码返回意外结果? (条件变量)

c - 为什么我的程序不允许我进行第二次输入?