c - 接收 SIGSEGV 的程序可能是针对 0xffffffff 的指针

标签 c segmentation-fault

我正在用户空间调试一个程序,并且正在接收一个指针的 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 上是否有效。

最佳答案

我相信 0xffffffffINVALID_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, call GetLastError.

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

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

关于c - 接收 SIGSEGV 的程序可能是针对 0xffffffff 的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476552/

相关文章:

c - 指针赋值将指针从 64 位截断为 32 位

C 重新分配错误

编译器不允许我编辑传递的字符串

C:删除双向链表中的第一项时出现段错误

c - 第二次调用 opendir 时出现段错误

c - 错误: invalid digit "8" in octal constant

c - 覆盖静态库中的弱符号

c - 使用openssl(C语言)去除解密结果中的污垢

c++ - 段错误 - 已使用新的和删除的。在运行时正在创建大量数组(无界数组)

c - 没有为指针分配内存,这会导致我在 C 中出现段错误(核心转储)吗?