![]() |
1
12
没有可移植的方法来测试除NULL以外的任何无效指针。评价
但这并不是一个完整的解决方案。唯一真正的解决方案是首先修复滥用空指针的问题。 |
![]() |
2
2
您根本不应该对空指针执行指针算术(包括数组索引)。
|
![]() |
3
1
如果可能的话,尝试处理未定义的行为将始终非常依赖于您的平台、编译器、版本等。 Common*nixes从不精确地映射地址空间的第一页以捕获空指针访问,因此您可以检查指针值是否在0到4096之间(或者系统使用的任何页面大小)。 但不要这样做,你不能防范一切可能出错的事情,而是要把重点放在正确的代码上。如果有人给你传递了一个无效的指针,那么很可能是指针验证检查无法修复的严重错误。 |
![]() |
4
1
有没有什么办法可以施加一些影响来纠正那些糟糕的代码?这不可能有好结果。从法律上讲,仅仅创建一个无效指针是未定义的行为。
由于使用错误的指针都可能导致程序失败,因此应该考虑当代码触发内存冲突时会发生什么情况。
另外,我不知道你的
|
![]() |
5
1
如果你不介意一个非常糟糕的黑客,你可以用
我不认为
|
![]() |
6
1
我真的不建议尝试解决别人代码中的错误。如果您在开发代码时没有运行通过调试器编写的所有内容,那么再多的检查也无法帮助您捕获所有问题。让他们修改代码。
通过静态分析工具定期运行代码也有帮助。 请记住,可能不是某人忘记初始化指针,也可能是其他人从完全不相关的地方通过坏内存写入来覆盖该指针。也有一些工具可以帮助追踪这些东西。
3)当C++ 11最终发布
对于记录,C++标准明确声明空指针常量是一个值为0的rValueType类型。所以请不要再胡说空指针不必等于零。 |
![]() |
7
0
|
![]() |
8
0
您必须考虑您的特定操作系统和硬件体系结构。如果您只对检测“接近null”的指针感兴趣,那么您可以使用ASSERT(i>pageSize),假设第一页在操作系统中始终是写保护的。 但是。。。显而易见的问题是:为什么要麻烦?在这种情况下,操作系统会检测到空值,正如你所指出的,SEGV和ASSERT一样好,不是吗? |
![]() |
CH_YUR · 为什么这段代码有分段错误? 2 年前 |
![]() |
Okonjo Mitchel · CS50凯撒:分段故障问题 2 年前 |
![]() |
Drin Kurtishi · cs50在线课程中凯撒问题集的问题 2 年前 |
![]() |
DynamicApproach · 提取exec函数的参数 2 年前 |
![]() |
Horcrux7 · 如何使用jffi/jnr处理SIGSEGV? 2 年前 |
![]() |
J.Doe · 向函数传递双指针以获取C中的字符串 6 年前 |