LINUX.ORG.RU

История изменений

Исправление quasimoto, (текущая версия) :

stack_pointer -= size;

Так push(10005000) откатит стек на 10005000 (> 1024 * 1024) uint-ов и запишет (куда-то) 10005000 (то есть SIGSEGV). Лучше так (и сигнатуры другие):

#define STACK_TYPE int
#define STACK_SIZE (1024 * 1024)

STACK_TYPE stack[STACK_SIZE], *sp = stack;

void push(STACK_TYPE);
STACK_TYPE * pop(void);

inline void push(STACK_TYPE x) { assert(sp < stack + STACK_SIZE); *sp++ = x; }
inline STACK_TYPE * pop(void) { assert(sp > stack); return --sp; }

Исходная версия quasimoto, :

stack_pointer -= size;

Так push(10005000) откатит стек на 10005000 (> 1024 * 1024) int-ов и запишет (куда-то) 10005000 (то есть SIGSEGV). Лучше так (и сигнатуры другие):

#define STACK_TYPE int
#define STACK_SIZE (1024 * 1024)

int stack[STACK_SIZE], *sp = stack;

void push(STACK_TYPE);
STACK_TYPE * pop(void);

inline void push(STACK_TYPE x) { assert(sp < stack + STACK_SIZE); *sp++ = x; }
inline STACK_TYPE * pop(void) { assert(sp > stack); return --sp; }