在今天的讨论中,我发现在VxWorks和LynxOS中都有检查,它们告诉您为指针分配的地址来自一个有效范围。这是我第一次听到这段代码,比如我分配了int *i=&variable;。
我应该得到一个警告或错误,说明在我的应用程序中,我不能将地址值赋值给整数。
就像我做空检查时,我只检查地址0x00000000。但在这种情况下,地址可能是0x00000001。如果它是未映射的区域,并且可能无法访问,则也是无效的情况。对于Linux来说,是否有人知道类似的事情,或者可以指导如何在VxWorks或LynxOS中完成它。
有什么主意吗?
发布于 2017-08-23 14:27:38
您在VxWorks中查找的函数称为vxMemProbe。
基本上,vxMemProbe库插入特殊的异常处理代码来捕获页面错误或总线错误。vxMemProbe函数用于检查地址对读或写是否有效。它还允许您测试特定地址是否可以使用给定的数据宽度(8、16、32、64位)和对齐方式访问。
vxMemProbe的底层机制与特定的体系结构、异常处理机制相关联。vxMemProbe库将代码插入到异常处理程序中。当您探测触发异常的地址时,处理程序将检查vxMemProbe是否触发了异常。如果是,则处理程序在异常之前恢复状态处理器,并将执行返回到调用vxMemProbe的位置,同时还通过给定的调用约定返回值。
发布于 2017-08-23 13:11:58
这里有几个误解:
NULL。对于其他值,则取决于上下文。指针指向当前活动的对象时是有效的。(请注意,在您的int *i = &variable示例中,这几乎是正确的,因为只有当是从当前作用域访问的variable时,这才是有效的语法)NULL不一定意味着一个所有位为零的值。这是最常见的情况,但是有一些平台可以为NULL指针使用不同的位模式。C标准甚至允许不同类型的指针对NULL有不同的表示形式。尽管如此,将0转换为指针类型仍然保证会导致此类型的NULL指针。SIGSEGV信号,这将导致程序立即异常终止(分段错误)。发布于 2017-08-23 13:30:12
通常,您不能做您想做的事情,正如费利克斯·帕门的回答中所解释的那样。
我应该得到一个警告或错误,说明在我的应用程序中,我不能将地址值赋值给整数。
静态和可靠地检测所有指针错误是不可能的(因为可以证明它等同于解决停止问题)。顺便说一句,您可能会考虑使用静态程序分析工具,比如Frama-C。
在Linux上,原则上,您可以在运行时测试给定地址是否在虚拟地址空间中有效,例如使用/proc/,例如解析/proc/self/maps伪文本文件(以理解终端中的cat /proc/$$/maps,然后是cat /proc/self/maps)。见proc(5)。实际上,我不建议经常这样做(这可能太慢了),当然它不是编译器的内建函数(您应该自己编写)。顺便说一句,要注意ASLR。
然而,有一些工具可以帮助检测(某些)错误的地址使用,特别是缬磨和地址消毒剂工具,阅读GCC的仪表选项并尝试用-fsanitize=address编译.
不要忘记编译包含所有警告和调试信息的代码,所以使用gcc -Wall -Wextra -g来编译它。
顺便说一句,如果您在某个全局指针中存储某个局部变量的地址,并且在该局部变量之后取消该指针的引用,则仍然有一些未定义行为 (即使您的代码没有崩溃,因为通常在您的调用堆栈上取消引用某个随机地址),您应该是非常惊慌的。应该始终避免使用UB。
https://stackoverflow.com/questions/45840590
复制相似问题