接收SIGSEGV的程序可以用于0xffffffff的指针

时间:2012-05-07 04:13:05

标签: c sigsegv

我正在调试用户空间中的程序,并且正在接收SIGSEGV指针,我认为该指针可能是值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上是否有效。

3 个答案:

答案 0 :(得分:4)

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

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

  

返回值

     

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

     

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

通常,任何指针值都可以指向有效内存,包括NULL。但是,许多操作系统和语言运行时为无效页面保留了接近0的空间,以便在解除引用NULL时为程序员提供有用的崩溃。此空间可以在两个方向上扩展,在这种情况下,它在32位系统上包含0xffffffff。并且C / C ++系统中的任何对象都不会在NULL处有一个地址(因此,如果NULL处有某些内容,则可能最好不要单独使用。)

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

答案 1 :(得分:2)

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

因此,对NULL的测试并不能保证指针有效。

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

答案 2 :(得分:0)

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