【问题标题】:Should I do this?我应该这样做吗?
【发布时间】:2013-08-09 15:05:59
【问题描述】:
void Clients::SetFog(char* fog)
{
  char Buffer[45];
  sprintf(Buffer, "d %s", fog);
  CMD(ID, SV_CMD_RELIABLE, Buffer);
  RtlZeroMemory(Buffer, sizeof(char));
}

我的问题是;我不确定在函数中定义缓冲区、井字符和 int 类型变量时如何处理。正如您注意到的那样,我从内存中将其归零,我使用几乎所有定义类型的函数来执行此操作,以保持内存清洁,我正在构建的应用程序的类型和它的平台我无法调试那么深/窥视内存。

【问题讨论】:

  • 为什么要使用函数调用将一个字节设置为零?

标签: c++ variables memory c++11 buffer


【解决方案1】:

首先,您没有将 Buffer 的内存完全归零

RtlZeroMemory(Buffer, sizeof(char));

只清零第一个字节,因为 sizeof(char) 是 1

其次,您的代码不安全,因为 strlen(fog) 可能超过 Buffer 的长度(即 45)

第三个你的问题不清楚。你是什​​么意思问“我不确定在函数中定义缓冲区、字符和 int 类型变量时如何处理”。一般的答案是,它们的处理方式与它们不是在函数内定义的方式相同。请问您可以澄清您的问题吗?

【讨论】:

  • 雾不会出现缓冲区溢出,是什么让你认为它会达到更大的长度?这不是来自客户的输入。
  • 顺便说一下,char的字节大小是4。
  • 在 C/C++ 中 sizeof(char) 的定义是 1,标准是这样说的。
  • @SergioPotatoNoseAllegretti 实际 C++ 程序中最常见的两个错误是资源生命周期(例如取消引用无效指针、未能delete 指针)和缓冲区溢出。是什么让某人假设一个函数接受一个没有长度的char* 并将其填充到一个固定大小的缓冲区中而没有任何检查可能会溢出?因为数以百万计的程序都存在这种错误。为了防止该错误,您必须审核从现在到该代码生命周期结束为止对该函数的每次使用,并知道缓冲区的长度不得超过 42。
  • @SergioPotatoNoseAllegretti 我说“可能超过”,因为在您提供的代码中没有检查它没有。并且 sizeof(char) 在 C/C++ 中为 1,正如这里已经说过的那样。
猜你喜欢
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 2012-08-13
  • 2023-03-19
  • 1970-01-01
  • 2014-08-30
  • 1970-01-01
相关资源
最近更新 更多