2

我正在用户空间中调试一个程序,并且正在接收一个SIGSEGV我认为可能是 value 的指针0xffffffff

我想知道是否0xffffffff是一个有效的指针地址??

我使用了 GDB,下面是代码列表:

1414
1415        /* convert object handle */
1416        file = (PSLhandle_t*)hFile;
1417
1418        /* param check */
1419        if(file->hobject.fdesc == 0)   <----------------- it may be crashing here
1420            return INVALID_SET_FILE_POINTER;





----------------- during debugging---------------------------


1412        if((hFile == NULL) || (lpBuffer == NULL))
(gdb) s
1419        if(file->hobject.fdesc == 0)
(gdb) print file
No symbol "file" in current context.
(gdb) print hFile
$1 = (HANDLE) 0xffffffff
(gdb) s

Program received signal SIGSEGV, Segmentation fault.
WriteFile (hFile=0xffffffff, lpBuffer=0xb7f69294, nNumberOfBytesToWrite=65516, lpNumberOfBytesWritten=0xb3933238,
    lpOverlapped=0x0) at PSLWinWrapper.c:1419
1419        if(file->hobject.fdesc == 0)

我正在使用 Linux ,

[root@DellB app]# uname -a Linux DellB 2.6.23.1-42.fc8 #1 SMP 2007 i686 i686 i386 GNU/Linux

我已经检查过了NULL

/* param check */
if((hFile == NULL) || (lpBuffer == NULL)) <-------- CHECKED ALREADY FOR NULL
    return INVALID_SET_FILE_POINTER;

/* convert object handle */
file = (PSLhandle_t*)hFile;

/* param check */
if(file->hobject.fdesc == 0) <-------------- CRASH HERE
    return INVALID_SET_FILE_POINTER;

我想知道是否0xffffffff是一个有效的指针地址?是否有任何 API 可以验证指针在用户空间中的 LINUX 上是否有效。

4

3 回答 3

4

我相信,至少在 32 位系统上0xffffffff是这样。INVALID_HANDLE_VALUE

许多 Windows API 函数返回INVALID_HANDLE_VALUE以指示发生了错误。例如,来自CreateFile文档(s​​ource):

返回值

如果函数成功,则返回值是指定文件、设备、命名管道或邮槽的打开句柄。

如果函数失败,则返回值为INVALID_HANDLE_VALUE。要获取扩展的错误信息,请调用GetLastError

通常,任何指针值都可以指向有效内存,包括NULL. 但是许多操作系统和语言运行时为无效页面保留了一个接近 0 的空间,以便为程序员在取消引用时提供有用的崩溃NULL。这个空间可以双向扩展,在这种情况下,它包括0xffffffff在 32 位系统上。并且 C/C++ 系统中的任何对象都不会有地址 at NULL(所以如果 有什么东西NULL,最好不要管它)。

您的第二个问题:是的,有一种方法可以检查指针是否指向 Linux 上的有效内存(这与“有效指针”的概念略有不同)。取消引用指针并查看您的程序是否存在段错误。安装信号处理程序来捕获故障,使用长跳转从信号处理程序返回。

于 2012-05-07T04:14:28.817 回答
2

NULL不是唯一无效的指针值。
通常,访问任何不是以正常方式之一获得的指针(例如变量的地址或 的返回值malloc)都是未定义的行为。这并不意味着访问它会崩溃,但它确实意味着它可能会崩溃。

所以测试NULL并不能保证指针是有效的。

具体来说,0xffffffff在几乎任何常见平台上都是无效的。
即使它是有效的,并且指向内存中的最后一个字节,你也只能访问这个字节,因为后面的字节在 address 0,这肯定是无效的。

于 2012-05-07T06:18:31.860 回答
0

具体来说,0xffffffff 是 32 位有符号整数 -1 的无符号值。您的问题的一个可能原因是任何返回 hFile 值的函数都会出错并返回 -1。当返回类型是指针时,大多数理智的程序在出错时返回 NULL,它的整数值为 0。这种情况可能是个例外。您能显示最初分配 hFile 的位置吗?

于 2012-05-07T05:16:59.000 回答