我正在用户空间调试一个程序,并且正在接收一个指针的 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 应用程序]# 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 上是否有效。
最佳答案
我相信 0xffffffff
是 INVALID_HANDLE_VALUE
,至少在 32 位系统上是这样。
许多 Windows API 函数返回 INVALID_HANDLE_VALUE
以指示发生了错误。例如,来自 CreateFile
文档 (source):
Return value
If the function succeeds, the return value is an open handle to the specified file, device, named pipe, or mail slot.
If the function fails, the return value is
INVALID_HANDLE_VALUE
. To get extended error information, callGetLastError
.
一般来说,任何指针值都可以指向有效内存,包括NULL
。但是许多操作系统和语言运行时为无效页面保留了接近 0 的空间,以便在程序员取消引用 NULL
时为程序员提供有用的崩溃。此空间可以在两个方向上扩展,在这种情况下,它在 32 位系统上包括 0xffffffff
。 C/C++ 系统中的任何对象都不会在 NULL
处有地址(因此,如果在 NULL
处有某些内容,最好不要管它)。
您的第二个问题:是的,有一种方法可以检查指针是否指向 Linux 上的有效内存(这与“有效指针”的概念略有不同)。取消引用指针并查看您的程序是否出现段错误。安装一个信号处理程序来捕获错误,使用长跳转从信号处理程序返回。
关于c - 接收 SIGSEGV 的程序可能是针对 0xffffffff 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476552/