【发布时间】:2016-11-10 08:18:02
【问题描述】:
包含的程序应该在 Linux 中产生分段错误,但它不会:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
/* This program should produce a segmentation error */
/* but it doesn't */
/* Therefore memory bounds are not being checked by the kernel */
typedef struct {
double x;
} blkfmt;
int main()
{
blkfmt *blk;
unsigned char *p;
blk = (blkfmt *) malloc(sizeof(blkfmt));
p = (unsigned char *) blk + 16384;
/* this assignment should produce a segmentation error */
*p = (unsigned char) 0xff;
/* this print statement should produce a segmentation error */
printf("%02x %d\n", *p, sizeof(blkfmt));
free(blk);
return(0);
} /* main */
制作文件:
OBJ=bug.o
CC=gcc
CFLAGS=-c -Wall -O2
LDFLAGS=
bug: $(OBJ)
$(CC) -Wall -O2 $(OBJ) -o bug $(LDFLAGS)
bug.o: bug.c
$(CC) $(CFLAGS) bug.c
clean:
rm -f bug $(OBJ)
【问题讨论】:
-
它将写入预期的结构之外,但可能不会写入堆栈。为什么会出现段错误?
-
这就是未定义行为的问题。由于内存分配器只需要遵循一些规则,它们几乎可以做任何其他可以想象的事情。在这种情况下,您的 malloc 可能会分配更大的内存区域,因此您可以写入它。但你不能指望这一点。
标签: linux kernel memory-management