为什么这是一个内存复制错误 - Insure ++误报?

时间:2010-01-07 01:23:33

标签: c++ debugging memory-management

我一直在尝试使用一些科学代码运行Insure++并报告许多错误,但公平地说,它正式不支持K& RC,我不知道有多少K& R功能已经完成其评估过程。它正在测试的C和C ++代码正在从WPF应用程序调用的DLL中运行。

令我困惑的一个错误报告是以下内容,我相信它是安全的代码,但我正在尝试找出它认为是错误的原因(它确实有效)。如果有人了解为什么这可能是一个错误条件,我会感兴趣。

[MacImagePlot.c:984] **READ_OVERFLOW**
SetCursorQD(*GetCursorQD(watchCursor));

Reading overflows memory: GetCursorQD(watchCursor)

bbbbb
| 4 | 4 |
    rrrrr

Reading (r) : 0x5639d164 thru 0x5639d167 (4 bytes)
From block (b) : 0x5639d160 thru 0x5639d163 (4 bytes)
gWatchCursor, declared at WPFMacGraphics.cpp, 418

一些非常简单的代码。

    typedef int Cursor;
    typedef Cursor* CursPtr;
    typedef CursPtr* CursHandle;
    CursHandle GetCursorQD (short cursorID);
    void SetCursorQD (const Cursor *crsr);
    enum {
    ....
     watchCursor =  4 
    };


    // file globals
    Cursor gWatchCursor=watchCursor;
    CursPtr gWatchCursorPtr = &gWatchCursor;

    CursHandle GetCursorQD (short cursorID)
    {
      if (cursorID==watchCursor)  // this is actually the only case ever called
        return &gWatchCursorPtr;
      return 0;
    }

4 个答案:

答案 0 :(得分:1)

我不想这么说,但我怀疑你的问题是缺少一些神秘的函数修饰符,以确保堆栈上的数据在越过DLL边界时不会被淹没。我建议编写一个复制代码的简单应用程序,但在一个模块中完成所有操作,看看Insure ++是否仍然检测到错误。如果没有,请准备好通过__declspec文档。

答案 1 :(得分:0)

我对你正在谈论的工具一点都不熟悉,但是你确认你的GetCursorQD函数正在返回你期望的指针,而不是NULL / 0

对于watchCursor的枚举定义(或者在其他地方以不同的方式声明,或者它拾取局部变量而不是枚举),也许发生了一些不可思议的事情。

答案 2 :(得分:0)

与Soapbox一样,我不熟悉Insure++

但是看一下代码,无疑是有点令人困惑......所以

该typedef使CursHandle有效地成为指向int ...

的指针
  • CursHandle是CursPtr
  • 类型的指针
  • CursPtr是Cursor
  • 类型的指针
  • Cursor是typedef'd类型为int

但是在GetCursorQD中,你使用'int的双重地址?我说“双地址”的原因是该函数返回gWatchCursorPtr &gWatchCursorPtr 地址输入CursHandle,而后者是一个全局变量,它是gWatchCursor 地址 &gWatchCursor 类型为Cursor

你对函数的返回类型的定义与全局变量名的 typeof 不匹配,尽管typedef是......这就是我的想法......

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:0)

我假设以下行是问题:

  if (cursorID==watchCursor) 
  • cursorID定义为short(通常为2个字节)

  • watchCursor是枚举的一部分,因此类型为int(32位操作系统上为4个字节)

这实际上不是问题。只要枚举值不超过2字节范围,编译器就会正确地转换其中一个参数。

根据我的经验,所有静态(以及运行时)代码分析工具都会报告许多误报(我试过其中一些)。它们当然有所帮助,但是从真正的错误中断言误报需要一段时间。