如何使用 NULL 检查以外的内置函数来验证指针?

how to validate a pointer using built in functions other than a NULL check?

在今天的讨论中,我发现 VxWorksLynxOS 中有检查,告诉你你分配的地址因为指针来自有效范围。这是我第一次听说这个代码,就像我分配 int *i=&variable;.

我应该收到一条警告或错误,指出在我的应用程序中我无法将地址值分配给整数。

就像我做 NULL 检查一样,我只检查地址 0x00000000。但是地址可能是 0x00000001。如果它是未映射的区域并且可能无法访问,这也是无效的情况。是否有人知道 Linux 类似的事情,或者可以指导它在 VxWorksLynxOS.

中是如何完成的

有什么想法吗??

这里有几个误解:

  • 从C语言的角度来看,只有一个指针值保证无效,并且这是 NULL。对于其他值,这取决于上下文。当指针指向当前处于活动状态的对象时,它是有效的。 (请注意,这在您的 int *i = &variable 示例中是微不足道的,因为只有当 一个 variable 可从您当前的范围访问时,这才是有效的语法)

  • NULL 不一定表示所有位都为零的值。这是 最常见的情况 ,但可以有平台对 NULL 指针使用不同的位模式。 C标准甚至允许不同类型的指针对NULL有不同的表示。尽管如此,将 0 转换为指针类型仍保证会导致此类型的 NULL 指针。

  • 我不知道你在 VxWorks 中指的是什么,但是 Linux 当然会检查内存访问。如果进程试图访问未映射到虚拟地址 space 中的地址,则会向此进程发送 SIGSEGV 信号,这会导致程序立即异常终止( 段错误 ).

中所述,通常您无法随心所欲。

I should get a warning or error which says that In my application I cannot assign the address value to the integer.

静态且可靠地检测所有指针错误是不可能的(因为它可以被证明等同于解决 halting problem). BTW you might consider using static program analysis tools like Frama-C.

在 Linux 上,原则上,您可以在运行时测试给定地址在 virtual address space by e.g. using /proc/, e.g. by parsing the /proc/self/maps pseudo textual file (to understand what I mean try cat /proc/$$/maps in a terminal, then cat /proc/self/maps). See proc(5). In practice I don't recommend doing that often (it probably would be too slow), and of course it is not a builtin function of the compiler (you should code it yourself). BTW, be aware of ASLR 中是否有效。

但是,有一些工具可以帮助检测(某些)错误地址的使用,特别是 GCC 的 valgrind and the address sanitizer facility, read about instrumentation options 并尝试使用 -fsanitize=address ...

进行编译

不要忘记使用所有警告和调试信息编译您的代码,因此使用 gcc -Wall -Wextra -g 来编译它。

顺便说一句,如果您将某个局部变量的地址存储在某个全局指针中,并在该局部变量进入范围后取消对该指针的引用,您仍然有一些 undefined behavior (even if your code don't crash, because you usually dereference some random address on your call stack) and you should be very scared。应始终避免 UB。

您在 VxWorks 中寻找的函数称为 vxMemProbe

基本上,vxMemProbe 库会插入特殊的异常处理代码来捕获页面错误或总线错误。 vxMemProbe 函数用于检查地址是否可读或可写。它还允许您测试特定地址是否可以通过给定的数据宽度(8、16、32、64 位)和对齐方式访问。

vxMemProbe 的底层机制与特定体系结构的异常处理机制相关。 vxMemProbe 库将代码插入到异常处理程序中。当您探测触发异常的地址时,处理程序会检查 vxMemProbe 是否触发了异常。如果是这样,则处理程序将异常之前的状态处理器和 returns 执行恢复到调用 vxMemProbe 的位置,同时还通过给定调用约定的体系结构返回值。