如何检查void指针是否指向任意低地址?

时间:2019-03-14 21:04:00

标签: c pointers

我的程序出现了设置错误,因为在某些时候,指针的值被设置为0x11。我不知道为什么或如何发生这种情况,并且代码太长了,无法在此处发布。因此,我想检查并避免这种情况,即指针指向0x11。

现在,我有if (ptr != 0)很好,因为它检查NULL指针。但它不会检查此随机断开的指针。我尝试了if (ptr <= 0x11),还尝试了将ptr转换为各种类型(longint等),但是它从来没有被抓住。

是否有一种方法可以捕获此指针,以便if语句返回false?

编辑:ptr的类型为void*

1 个答案:

答案 0 :(得分:2)

正如SergeyA在评论中所写,您的方法是错误的。您不应该寻找特定的值0x11。指针很可能恰好具有该值。

我建议您使用gcc -Wall -Wextra -pedantic进行编译,并注意所有警告。我尤其会寻找未初始化的变量。请记住,指针不会自动初始化为null。如果未初始化,则它们(可能)将具有之前恰好在内存中的任何值。我说“可能” 是因为编译器 可以将它们初始化为null或另一个值,而不会违反C标准。

此外,正如Eugene在评论中所写,检测到指针具有此特定值并不能解决您的问题。如果幸运的话,它可以帮助您发现问题,但是很可能浪费时间。

我可能会提到您的测试是正确的。看这段代码:

#include <stdio.h>

int main()
{
    void *ptr = (void*)0x11;
    if(ptr == (void*)0x11) printf("ptr == 0x11\n");
    if(ptr <= (void*)0x11) printf("ptr <= 0x11\n");
    if(ptr <= (void*)0x10) printf("ptr <= 0x10\n");
}

它输出:

$ ./a.out 
ptr == 0x11
ptr <= 0x11

正如预期的那样。这表明您的代码具有未定义的行为

您可以做的另一件事是对自己选择的某个值进行显式初始化。看这段代码:

int main(int argc, char ** argv) {
    // 42 is 2a in hex, and 42 is a good random value
    char *ptr=(void*)0x2a; 


    // If any arguments are supplied to the program         if(argc > 1) {
        ptr = argv[1];
        printf("The first argument has address %p\n", (void*) ptr);
    }

    if(ptr == (void*) 0x2a)
        printf("Something fishy happened.\n");
}

输出:

$ ./a.out 
Something fishy happened.

$ ./a.out foo
The first argument has address 0x7ffca6323ad8

虽然第一个参数的地址实际上可能是0x2a,但极不可能。我认为这可能是发现问题的一种很好的方法。