HP-UX cc使用默认设置允许空引用,在具有RHEL的gcc中可能吗?

问题描述 投票:1回答:1

从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程序(以允许空解引用)?我知道这是一个糟糕的编码实践,并且我不会用它来创建新代码。谢谢。

c gcc rhel hp-ux cc
1个回答
0
投票

这可以通过在程序中添加一些代码来实现。

Linux内核的最小映射地址通常为> 0,以防止未检测到空指针。他们使用通常设置为4096(32位)或65536(64位)的系统控制vm.mmap_min_addr对此进行控制。尽管不建议这样做,但您可以将此设置为使用

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

参考:

© www.soinside.com 2019 - 2024. All rights reserved.