我一直在尝试使用一些科学代码运行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;
}
答案 0 :(得分:1)
我不想这么说,但我怀疑你的问题是缺少一些神秘的函数修饰符,以确保堆栈上的数据在越过DLL边界时不会被淹没。我建议编写一个复制代码的简单应用程序,但在一个模块中完成所有操作,看看Insure ++是否仍然检测到错误。如果没有,请准备好通过__declspec文档。
答案 1 :(得分:0)
我对你正在谈论的工具一点都不熟悉,但是你确认你的GetCursorQD
函数正在返回你期望的指针,而不是NULL
/ 0
?
对于watchCursor
的枚举定义(或者在其他地方以不同的方式声明,或者它拾取局部变量而不是枚举),也许发生了一些不可思议的事情。
答案 2 :(得分:0)
与Soapbox一样,我不熟悉Insure++
。
但是看一下代码,无疑是有点令人困惑......所以
该typedef使CursHandle有效地成为指向int ...
的指针但是在GetCursorQD中,你使用'int的双重地址?我说“双地址”的原因是该函数返回gWatchCursorPtr
( &gWatchCursorPtr
)的地址输入CursHandle
,而后者是一个全局变量,它是gWatchCursor 的地址( &gWatchCursor
)类型为Cursor
。
你对函数的返回类型的定义与全局变量名的 typeof 不匹配,尽管typedef是......这就是我的想法......
希望这有帮助, 最好的祝福, 汤姆。
答案 3 :(得分:0)
我假设以下行是问题:
if (cursorID==watchCursor)
cursorID
定义为short
(通常为2个字节)
watchCursor
是枚举的一部分,因此类型为int
(32位操作系统上为4个字节)
这实际上不是问题。只要枚举值不超过2字节范围,编译器就会正确地转换其中一个参数。
根据我的经验,所有静态(以及运行时)代码分析工具都会报告许多误报(我试过其中一些)。它们当然有所帮助,但是从真正的错误中断言误报需要一段时间。