我正在调试用户空间中的程序,并且正在接收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上是否有效。
答案 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的位置吗?