c-HP-UX cc使用默认设置来允许null取消引用,这在带有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程序吗?我知道这是一个糟糕的编码实践,我不会用它来创建新的代码。非常感谢。

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

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 = %pn", p);
printf(" map = %pn", mmap(NULL, 4096, PROT_READ,
MAP_FIXED | MAP_ANON | MAP_PRIVATE, 0, 0));
n = *p;
printf("*p = %dn", n);
return 0;
}

示例运行:

$ ./ref0
p = (nil)
Segmentation fault (core dumped)
$ ./ref0 map
p = (nil)
map = (nil)
*p = 0

参考文献:

  • https://access.redhat.com/articles/20484
  • https://wiki.debian.org/mmap_min_addr

相关内容

  • 没有找到相关文章

最新更新