Mercurial > hg > early-roguelike
view urogue/lint-curses.h @ 280:70aa5808c782
Fix potential segfaults at restore related to ctime().
In some games, restore() passes the result of ctime() to mvprintw() or
some other variadic message-formatting function. If ctime() has not
been declared properly, its return type is inferred to be int instead
of char *. This does not cause a warning because the compiler does not
know the correct type of variadic arguments.
On platforms where ints and pointers are not the same size, this can,
probably depending on alignment, result in a segfault that is not easy
to trace.
Including time.h fixes the problem. Some games manually declared
ctime() and avoided the bug. These declarations have also been
replaced with the include.
author | John "Elwin" Edwards |
---|---|
date | Fri, 15 Sep 2017 20:51:10 -0400 |
parents | c495a4f288c6 |
children |
line wrap: on
line source
/* lint-curses.h UltraRogue: The Ultimate Adventure in the Dungeons of Doom Copyright (C) 1993, 1995 Herb Chong All rights reserved. See the file LICENSE.TXT for full copyright and licensing information. */ /* Sufficient info to pass lint */ #ifndef TRUE #define TRUE 1 #endif #ifndef FALSE #define FALSE 0 #endif #define getyx(win,y,x) y = win->_cury, x = win->_curx struct screen { int opque_data_type; }; typedef struct { int _cury; int _curx; } WINDOW; extern WINDOW *stdscr; extern WINDOW *curscr; extern int LINES; extern int COLS; extern char *unctrl(char c); extern void initscr(void); extern int wmove(WINDOW *window, int Line, int Column); extern int move(int Line, int Column); extern int addch(char c); extern int mvaddch(int y, int x, char c); extern int waddch(WINDOW *window, char c); extern int mvwaddch(WINDOW *window, int y, int x, char c); extern int mvwinch(WINDOW *window, int y, int x); extern int winch(WINDOW *window); extern int mvinch(int y, int x); extern int getch(void); extern int wgetch(WINDOW *window); extern void clear(void); extern void wclear(WINDOW *window); extern void refresh(void); extern void wrefresh(WINDOW *window); extern void clearok(WINDOW *window, int flag); extern void endwin(void); extern void touchwin(WINDOW *window); extern void overlay(WINDOW *w1, WINDOW *w2); extern void wclrtoeol(WINDOW *window); extern void wprintw(WINDOW *window, const char *fmt, ...); extern void mvprintw(int line, int col, char *fmt, ...); extern void mvwprintw(WINDOW *window, int line, int col, char *fmt, ...); extern int mvwaddstr(WINDOW *window, int y, int x, const char *str); extern int mvaddstr(int y, int x, char *str); extern int waddstr(WINDOW *window, char *str); extern int addstr(char *str); extern void standout(void); extern void wstandout(WINDOW *window); extern void standend(void); extern void wstandend(WINDOW *window); extern void noecho(void); extern void cbreak(void); extern void crmode(void); extern void nonl(void); extern void nl(void); extern int wgetch(WINDOW *window); extern WINDOW *newwin(int lines, int cols, int y, int x); extern void overwrite(WINDOW *w1, WINDOW *w2); extern void delwin(WINDOW *window); extern void printw(char *fmt, ...);