【问题标题】:How can I detect heap corruption in my case在我的情况下如何检测堆损坏
【发布时间】:2014-12-11 17:20:53
【问题描述】:

我想按照以下方法转换我的 STRUCT:

  • 将 STRUCT 转换为字符数组。
  • 将 char 表转换为 int 数组。
  • 将 int 数组转换为 char 数组。
  • 将 char 数组转换为 STRUCT。

但我在运行时有那些错误:

这是我的代码:

void rServer::convertStruct_to_char ( PCryptDATA p) {

    // ***********convert struct to Array of char ************
    char* frame= new char[p.size];
    cout << p.size <<endl;
    cout << endl;   
    memcpy(frame, &p, sizeof(p));


    //***********convert Array of char to array of int  ************
    int taille= p.size;
    int* out = new int[taille]; 
    for (int i=0; i<taille+1;i++) 
    {
        out[i]=frame[i];
    }

    delete [] frame;

    //***********convert Array of int to Array of char ************
    char* int2char = new char[taille];
    for (int i=0; i<taille+1;i++)
    {
        int2char[i]=out[i];
    }

    //delete [] int2char;

    //***********convert Array of char to STRUCT ************
    PCryptDATA t; //Re-make the struct
    memcpy(&t, int2char, sizeof(t));
}

您能否帮我找出运行时出现此问题的原因。

【问题讨论】:

  • 您在outint2char 的末尾写了一个字符:大小应该是taille+1,或者循环边界应该是taille。此外,p.sizesizeof(p) 之间存在一些混淆。
  • C++ 中的 C 风格函数被严重反对。你有 STL 和迭代器,你为什么要手动编写循环并玩指针?
  • 另外,char 通常是 1 个字节,而 int 是两个字节。通过将 int 复制到 char 数组中,您将破坏数据。
  • @ Mike Seymour,我不明白你注意到 p.size 和 sizeof(p) 之间有什么混淆!!
  • @Panagiotis Kanvos,我必须尊重以 char* 作为成员的结构,这就是为什么我必须手动编写循环。您能告诉我如何处理 int 数组到 char 数组的转换吗?

标签: c++ visual-c++ heap-memory


【解决方案1】:

这个

int* out = new int[taille]; 
for (int i=0; i<taille+1;i++) 
    out[i]=...

不好 - 在循环的最后一次迭代中,您将值分配给 out[taille],但 out 数组已分配给从 0 低谷 taille-1 索引的 taille 元素。结果,您写入了分配的块并覆盖了堆的其他一些块,从而破坏了它。

应该是:

int* out = new int[taille]; 
for (int i=0; i<taille;i++) 
    out[i]=...

其他 for 循环也是如此。

【讨论】:

  • 一个更严重的错误是将 1 字节 char 数组复制到 2 字节 int 数组并返回。数据肯定会被破坏,并且int2char you'' 也会超出缓冲区的末尾
  • @PanagiotisKanavos AFAIK 从char 复制到int 的值可能会扩展符号位 - 但这不会影响 8 个最低有效位。当复制回char 时,那些int 值被简单地截断,因此源值被恢复。你是什​​么意思?
  • @PanagiotisKanavos,但是当我使用调试器时,我发现我的结构被很好地复制了,并且我拥有与一开始使用的相同的数据。
猜你喜欢
  • 2012-10-20
  • 2011-08-20
  • 2011-07-24
  • 1970-01-01
  • 2011-09-29
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-06
相关资源
最近更新 更多