如何调整以下代码以防止缓冲区溢出?

How could the following code be adjusted to prevent a buffer overflow?

void updateConfigParams( void ) {
    char buffer [512];
    int i = 0;

while (( c = readFromWireless ()) != NULL) 
{
    buffer [ i ] = c;
    i += 1; 
} 
writeConfigParams ( buffer );
}

我刚开始处理缓冲区溢出,所以请有人告诉我如何更改以下代码以防止缓冲区溢出,并解释新代码如何停止写入超过缓冲区的末尾.

您可以添加以下 if 语句来检查缓冲区溢出情况。在递增变量 i

之后
i+=1;
if(i > 512)
    break;

一旦 i 达到缓冲区限制,您将退出循环。

您需要在 while 循环开始时添加缓冲区大小检查 如果(我== sizeof(缓冲区)) 打破;

如果 writeConfigParams 需要字符串,则在缓冲区末尾添加 \0

Buffer overflow 是当您尝试写入超出为缓冲区分配的内存地址时。

在您的情况下,您已经分配了 512 个字节,因此您的代码应确保您永远不会取消引用超出 buffer + 511 个字节。也就是说

buffer [i] // i should never exceed 511

你的代码应该有 if 检查,一旦你的索引计数器达到等于缓冲区的大小就停止接受输入。

void updateConfigParams( void ) {
    char buffer [512];
    int i = 0;

    while (i < 512 && ( c = readFromWireless ()) != NULL) {
        buffer [ i++ ] = c;
    } 
    writeConfigParams ( buffer );
}

我会按照以下思路做一些事情:

bool
updateConfigParams( void ) {
  char buffer[512] = {};
  int i = 0;

  while( (c = readFromWireless()) != NULL ) {
    if( i == sizeof(buffer) - 1 ) {
      warn("readFromWireless exceeded %zu byte limit", sizeof(buffer));
      return false;
    } 
    buffer[i++] = c;
  }
  writeConfigParams( buffer );
  return true;
}

根据程序的状态,简单地调用 err(3) 可能更合适。要点是:

  • 写入数组时,请始终确保您在边界内。
  • 将输入收集到数组中时,请始终为超出数组大小的输入做好准备。如何处理您无法接受的输入取决于应用程序。
  • 当程序员无法在编译时阻止的操作超出内部存储时 -- 例如无线设备发送 "too much" 数据 -- 通知用户 程序。上面,程序发出一条消息,函数 returns 一个错误状态。
  • 部分输入通常是可疑的,不应被接受。

编辑:根据评论,我将初始化添加到 buffer。由于 writeConfigParams 没有长度参数,它可能接受以 NUL 结尾的字符串。