代码之家  ›  专栏  ›  技术社区  ›  achoora

如何使用内置函数而不是空检查来验证指针?

  •  3
  • achoora  · 技术社区  · 7 年前

    在今天的一次讨论中,我发现 实时操作系统 并且在 这表明为指针指定的地址来自有效范围。这是我第一次像我指定的那样听到这个代码 int *i=&variable; .

    比如当我做空检查时,我只检查地址 0x00000000 . 但也有可能是地址 0x00000001 . 如果它是一个未映射的区域,并且可能无法访问,那么它也是无效的。有没有人知道Linux有类似的功能,或者可以指导它在 实时操作系统 LynxOS公司 .

    3 回复  |  直到 7 年前
        1
  •  6
  •   vxWizard    7 年前

    您在VxWorks中寻找的函数称为 VXM探针 .

        2
  •  3
  •   Basile Starynkevitch    7 年前

    一般来说,你不能做你想做的事,如中所述 Felix Palmen's answer .

    我应该得到一个警告或错误,它表示在我的应用程序中,我无法将地址值赋给整数。

    静态可靠地检测所有指针故障是不可能的(因为可以证明它等效于解决 halting problem ). 顺便说一句,你可以考虑使用 static program analysis 工具,如 Frama-C .

    原则上,在Linux上,您可以在运行时测试给定地址在您的 virtual address space /proc/ ,例如,通过解析 /proc/self/maps cat /proc/$$/maps 在终端中 cat /proc/self/maps ). 看见 proc(5) . 实际上,我不建议经常这样做(可能太慢),当然这不是一个 builtin 编译器的函数(您应该自己编写)。顺便说一句,请注意 ASLR

    然而,有一些工具可以帮助检测(某些)错误的地址使用,特别是 valgrind address sanitizer instrumentation options 并尝试使用 -fsanitize=address

    gcc -Wall -Wextra -g

    顺便说一句,如果您将某个局部变量的地址存储在某个全局指针中,并在该局部变量位于作用域后取消对该指针的引用,那么您仍然有一些 undefined behavior (即使您的代码没有崩溃,因为您通常会在 call stack scared

        3
  •  3
  •   user2371524 user2371524    7 年前

    这里有几个误解:

    • 指针值 无效,这是 NULL . 对于其他值,它取决于上下文。指针指向当前活动的对象时有效。(请注意,这在您的 int *i = &variable variable 可从当前范围访问)

    • 不一定意味着所有位都为零的值。这是 ,但也可能存在使用不同位模式的平台 无效的 . 仍然,正在转换 0 无效的 此类型的指针。

    • 我不知道你在VxWorks中到底指的是什么,但Linux当然会检查内存访问。如果进程尝试访问虚拟地址空间中未映射的地址,则会向该进程发送 SIGSEGV 导致程序立即异常终止的信号( 分段故障