c - HP-UX cc 使用默认设置来允许空取消引用,这在 RHEL 的 gcc 中是否可行?
问题描述
从 HPUX cc、c89 - C 编译器手册页:
-z Do not bind anything to address zero. This option
allows runtime detection of null pointers. See the
note on pointers below.
-Z Allow dereferencing of null pointers. See the note on
pointers below. The -z and -Z are linker options. See
ld(1) for more details.
然后从ld(1)
:
The default value of the -Z/-z option is -Z.
这意味着,默认情况下,在 HPUX 上使用此版本的 cc 编译的任何取消引用空指针的 C 程序都会将该值读取为 0 而不是 segfault。在 RHEL 上没有使用 gcc 或 cc 的选项。有谁知道我将如何在 RHEL 上使用这样的选项编译 C 程序(以允许 null 取消引用)?我知道这是一种糟糕的编码实践,我不会用它来创建新代码。谢谢你。
解决方案
这可以通过在您的程序中添加一些代码来实现。
Linux 内核有一个最小映射地址,通常 > 0,以防止空指针未被检测到。vm.mmap_min_addr
他们使用通常设置为 4096(32 位)或 65536(64 位)的系统控制来控制这一点。虽然不建议这样做,但您可以将其设置为使用
sudo sysctl -w vm.mmap_min_addr=0
或者永久设置:
echo "vm.mmap_min_addr=0" > /etc/sysctl.d/mmap_min_addr.conf
/sbin/sysctl -p
然后你可以在虚拟地址 0 处添加一个空的内存页:
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
int main(int argc, char **argv) {
int *p = NULL;
int n;
printf(" p = %p\n", p);
printf(" map = %p\n", mmap(NULL, 4096, PROT_READ,
MAP_FIXED | MAP_ANON | MAP_PRIVATE, 0, 0));
n = *p;
printf("*p = %d\n", n);
return 0;
}
示例运行:
$ ./ref0
p = (nil)
Segmentation fault (core dumped)
$ ./ref0 map
p = (nil)
map = (nil)
*p = 0
参考:
推荐阅读
- javascript - 如何使用从 GitHub API 获取数据动态填充我的表?
- python - 来自python中期考试的任务,字典中的列表,列表中的字典
- html - 如何在html中显示泰文字符
- asp.net-core - 尝试使用重定向到索引的按钮查看警报框
- pandas - 在熊猫数据框中以间隔的日期填充缺失的观测值
- mongodb - 将 Mongo Stitch 与 Firebase 存储结合使用?
- c# - 如何使用 CodeFirst 方法在 IdentityServer 4 的客户端表中添加新列?
- python - 计算机视觉算法改进激光圆点图案的建议更有特色
- ffmpeg - 将 M4a 采样率更改为自定义值
- laravel - 如何强制 Laravel Dusk 中的“类型”方法在浏览器中完全输入我的测试数据