mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-11-13 07:58:04 +00:00
Prevent calling function pointers cast to an incompatible type.
Most often, this had happened when casting comparison functions for qsort() like these: "int yax_cmpbunches(const int16_t *b1, const int16_t *b2)" to a function pointer type expecting "const void *". Alas, this is undefined behavior: see http://blog.frama-c.com/index.php?post/2013/08/24/Function-pointers-in-C and posts linked from it. At least two cases have not been fixed: - The savegame system maintains pointers which are either to data or a function in the generic "void *". This ought to be made into a union. - Probably also: #define OSD_ALIAS (int32_t (*)(const osdfuncparm_t*))0x1337 git-svn-id: https://svn.eduke32.com/eduke32@4068 1a8010ca-5511-0410-912e-c29ae57300e0
This commit is contained in:
parent
d2cd8af510
commit
514a3bfd64
8 changed files with 44 additions and 39 deletions
|
@ -214,9 +214,9 @@ void fade_editor_screen(int32_t keepcol);
|
||||||
extern int32_t getnumber_internal1(char ch, int32_t *danumptr, int32_t maxnumber, char sign);
|
extern int32_t getnumber_internal1(char ch, int32_t *danumptr, int32_t maxnumber, char sign);
|
||||||
extern int32_t getnumber_autocomplete(const char *namestart, char ch, int32_t *danum, int32_t flags);
|
extern int32_t getnumber_autocomplete(const char *namestart, char ch, int32_t *danum, int32_t flags);
|
||||||
|
|
||||||
int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, char sign, void *(func)(int32_t));
|
int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, char sign, const char *(func)(int32_t));
|
||||||
#define getnumber256(namestart, num, maxnumber, sign) _getnumber256(namestart, num, maxnumber, sign, NULL)
|
#define getnumber256(namestart, num, maxnumber, sign) _getnumber256(namestart, num, maxnumber, sign, NULL)
|
||||||
int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, void *(func)(int32_t));
|
int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, const char *(func)(int32_t));
|
||||||
#define getnumber16(namestart, num, maxnumber, sign) _getnumber16(namestart, num, maxnumber, sign, NULL)
|
#define getnumber16(namestart, num, maxnumber, sign) _getnumber16(namestart, num, maxnumber, sign, NULL)
|
||||||
void printmessage256(int32_t x, int32_t y, const char *name);
|
void printmessage256(int32_t x, int32_t y, const char *name);
|
||||||
void message(const char *fmt, ...) ATTRIBUTE((format(printf,1,2)));
|
void message(const char *fmt, ...) ATTRIBUTE((format(printf,1,2)));
|
||||||
|
|
|
@ -2595,10 +2595,10 @@ static int32_t sectors_components(int16_t hlsectcnt, const int16_t *hlsector, in
|
||||||
return 2;
|
return 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmpgeomwal1(const int16_t *w1, const int16_t *w2)
|
static int cmpgeomwal1(const void *w1, const void *w2)
|
||||||
{
|
{
|
||||||
const walltype *wal1 = &wall[*w1];
|
const walltype *wal1 = &wall[*(int16_t *)w1];
|
||||||
const walltype *wal2 = &wall[*w2];
|
const walltype *wal2 = &wall[*(int16_t *)w2];
|
||||||
|
|
||||||
if (wal1->x == wal2->x)
|
if (wal1->x == wal2->x)
|
||||||
return wal1->y - wal2->y;
|
return wal1->y - wal2->y;
|
||||||
|
@ -2608,7 +2608,7 @@ static int cmpgeomwal1(const int16_t *w1, const int16_t *w2)
|
||||||
|
|
||||||
static void sort_walls_geometrically(int16_t *wallist, int32_t nwalls)
|
static void sort_walls_geometrically(int16_t *wallist, int32_t nwalls)
|
||||||
{
|
{
|
||||||
qsort(wallist, nwalls, sizeof(int16_t), (int(*)(const void *, const void *))&cmpgeomwal1);
|
qsort(wallist, nwalls, sizeof(int16_t), &cmpgeomwal1);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -8946,7 +8946,7 @@ int32_t getnumber_autocomplete(const char *namestart, char ch, int32_t *danum, i
|
||||||
// 2: autocomplete names
|
// 2: autocomplete names
|
||||||
// 4: autocomplete taglabels
|
// 4: autocomplete taglabels
|
||||||
// 8: return -1 if cancelled
|
// 8: return -1 if cancelled
|
||||||
int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, void *(func)(int32_t))
|
int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char sign, const char *(func)(int32_t))
|
||||||
{
|
{
|
||||||
char buffer[80], ournamestart[80-17], ch;
|
char buffer[80], ournamestart[80-17], ch;
|
||||||
int32_t n, danum, oldnum;
|
int32_t n, danum, oldnum;
|
||||||
|
@ -8978,7 +8978,7 @@ int32_t _getnumber16(const char *namestart, int32_t num, int32_t maxnumber, char
|
||||||
|
|
||||||
if (func != NULL)
|
if (func != NULL)
|
||||||
{
|
{
|
||||||
Bsnprintf(buffer, sizeof(buffer), "%s", (char *)func(danum));
|
Bsnprintf(buffer, sizeof(buffer), "%s", func(danum));
|
||||||
// printext16(200L-24, ydim-STATUS2DSIZ+20L, editorcolors[9], editorcolors[0], buffer, 0);
|
// printext16(200L-24, ydim-STATUS2DSIZ+20L, editorcolors[9], editorcolors[0], buffer, 0);
|
||||||
printext16(n<<3, ydim-STATUS2DSIZ+128, editorcolors[11], -1, buffer,0);
|
printext16(n<<3, ydim-STATUS2DSIZ+128, editorcolors[11], -1, buffer,0);
|
||||||
}
|
}
|
||||||
|
@ -9017,7 +9017,7 @@ static void getnumber_clearline(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
// sign: |16: don't draw scene
|
// sign: |16: don't draw scene
|
||||||
int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, char sign, void *(func)(int32_t))
|
int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, char sign, const char *(func)(int32_t))
|
||||||
{
|
{
|
||||||
char buffer[80], ournamestart[80-13], ch;
|
char buffer[80], ournamestart[80-13], ch;
|
||||||
int32_t danum, oldnum;
|
int32_t danum, oldnum;
|
||||||
|
@ -9062,7 +9062,7 @@ int32_t _getnumber256(const char *namestart, int32_t num, int32_t maxnumber, cha
|
||||||
printmessage256(0, 0, buffer);
|
printmessage256(0, 0, buffer);
|
||||||
if (func != NULL)
|
if (func != NULL)
|
||||||
{
|
{
|
||||||
Bsnprintf(buffer, sizeof(buffer), "%s", (char *)func(danum));
|
Bsnprintf(buffer, sizeof(buffer), "%s", func(danum));
|
||||||
printmessage256(0, 9, buffer);
|
printmessage256(0, 9, buffer);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -785,9 +785,9 @@ static void yax_scanbunches(int32_t bbeg, int32_t numhere, const uint8_t *lastgo
|
||||||
scansector_retfast = 0;
|
scansector_retfast = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int yax_cmpbunches(const int16_t *b1, const int16_t *b2)
|
static int yax_cmpbunches(const void *b1, const void *b2)
|
||||||
{
|
{
|
||||||
return (bunchdist[*b2] - bunchdist[*b1]);
|
return (bunchdist[*(int16_t *)b2] - bunchdist[*(int16_t *)b1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -1009,8 +1009,7 @@ void yax_drawrooms(void (*SpriteAnimFunc)(int32_t,int32_t,int32_t,int32_t),
|
||||||
|
|
||||||
yax_scanbunches(bbeg, numhere, (uint8_t *)gotsector);
|
yax_scanbunches(bbeg, numhere, (uint8_t *)gotsector);
|
||||||
|
|
||||||
qsort(&bunches[cf][bbeg], numhere, sizeof(int16_t),
|
qsort(&bunches[cf][bbeg], numhere, sizeof(int16_t), &yax_cmpbunches);
|
||||||
(int(*)(const void *, const void *))&yax_cmpbunches);
|
|
||||||
|
|
||||||
if (numhere > 1 && lev != YAX_MAXDRAWS-1)
|
if (numhere > 1 && lev != YAX_MAXDRAWS-1)
|
||||||
Bmemset(lgotsector, 0, (numsectors+7)>>3);
|
Bmemset(lgotsector, 0, (numsectors+7)>>3);
|
||||||
|
@ -8459,7 +8458,7 @@ static inline int32_t raytrace(int32_t x3, int32_t y3, int32_t *x4, int32_t *y4)
|
||||||
#define _POSIX_REALTIME_SIGNALS
|
#define _POSIX_REALTIME_SIGNALS
|
||||||
#endif
|
#endif
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
static void sighandler(int32_t sig, const siginfo_t *info, void *ctx)
|
static void sighandler(int sig, siginfo_t *info, void *ctx)
|
||||||
{
|
{
|
||||||
const char *s;
|
const char *s;
|
||||||
UNREFERENCED_PARAMETER(ctx);
|
UNREFERENCED_PARAMETER(ctx);
|
||||||
|
@ -8611,7 +8610,7 @@ int32_t initengine(void)
|
||||||
#if !defined _WIN32 && defined DEBUGGINGAIDS && !defined GEKKO
|
#if !defined _WIN32 && defined DEBUGGINGAIDS && !defined GEKKO
|
||||||
struct sigaction sigact, oldact;
|
struct sigaction sigact, oldact;
|
||||||
memset(&sigact, 0, sizeof(sigact));
|
memset(&sigact, 0, sizeof(sigact));
|
||||||
sigact.sa_sigaction = (void (*)(int, siginfo_t*, void*))sighandler;
|
sigact.sa_sigaction = &sighandler;
|
||||||
sigact.sa_flags = SA_SIGINFO;
|
sigact.sa_flags = SA_SIGINFO;
|
||||||
sigaction(SIGFPE, &sigact, &oldact);
|
sigaction(SIGFPE, &sigact, &oldact);
|
||||||
#endif
|
#endif
|
||||||
|
@ -15628,10 +15627,10 @@ static void sideview_getdist(int16_t sw, int16_t sect)
|
||||||
m32_sidedist[sw] = p->x*m32_viewplane.x + p->y*m32_viewplane.y + (p->z>>4)*m32_viewplane.z;
|
m32_sidedist[sw] = p->x*m32_viewplane.x + p->y*m32_viewplane.y + (p->z>>4)*m32_viewplane.z;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sideview_cmppoints(const int16_t *sw1, const int16_t *sw2)
|
static int sideview_cmppoints(const void *sw1, const void *sw2)
|
||||||
{
|
{
|
||||||
int32_t dist1 = m32_sidedist[*sw1];
|
int32_t dist1 = m32_sidedist[*(int16_t *)sw1];
|
||||||
int32_t dist2 = m32_sidedist[*sw2];
|
int32_t dist2 = m32_sidedist[*(int16_t *)sw2];
|
||||||
|
|
||||||
if (dist2>dist1)
|
if (dist2>dist1)
|
||||||
return 1;
|
return 1;
|
||||||
|
@ -16240,7 +16239,7 @@ void draw2dscreen(const vec3_t *pos, int16_t cursectnum, int16_t ange, int32_t z
|
||||||
|
|
||||||
if (m32_sideview)
|
if (m32_sideview)
|
||||||
{
|
{
|
||||||
qsort(m32_wallsprite, m32_swcnt, sizeof(int16_t), (int( *)(const void *, const void *))&sideview_cmppoints);
|
qsort(m32_wallsprite, m32_swcnt, sizeof(int16_t), &sideview_cmppoints);
|
||||||
|
|
||||||
for (i=0; i<m32_swcnt; i++) // shouldn't it go the other way around?
|
for (i=0; i<m32_swcnt; i++) // shouldn't it go the other way around?
|
||||||
{
|
{
|
||||||
|
|
|
@ -972,10 +972,13 @@ void(*installusertimercallback(void(*callback)(void)))(void)
|
||||||
//
|
//
|
||||||
// getvalidmodes() -- figure out what video modes are available
|
// getvalidmodes() -- figure out what video modes are available
|
||||||
//
|
//
|
||||||
static int32_t sortmodes(const struct validmode_t *a, const struct validmode_t *b)
|
static int sortmodes(const void *a_, const void *b_)
|
||||||
{
|
{
|
||||||
int32_t x;
|
int32_t x;
|
||||||
|
|
||||||
|
const struct validmode_t *a = (const struct validmode_t *)a_;
|
||||||
|
const struct validmode_t *b = (const struct validmode_t *)b_;
|
||||||
|
|
||||||
if ((x = a->fs - b->fs) != 0) return x;
|
if ((x = a->fs - b->fs) != 0) return x;
|
||||||
if ((x = a->bpp - b->bpp) != 0) return x;
|
if ((x = a->bpp - b->bpp) != 0) return x;
|
||||||
if ((x = a->xdim - b->xdim) != 0) return x;
|
if ((x = a->xdim - b->xdim) != 0) return x;
|
||||||
|
@ -1093,7 +1096,7 @@ void getvalidmodes(void)
|
||||||
#undef CHECK
|
#undef CHECK
|
||||||
#undef ADDMODE
|
#undef ADDMODE
|
||||||
|
|
||||||
qsort((void *)validmode, validmodecnt, sizeof(struct validmode_t), (int32_t( *)(const void *,const void *))sortmodes);
|
qsort((void *)validmode, validmodecnt, sizeof(struct validmode_t), &sortmodes);
|
||||||
|
|
||||||
modeschecked=1;
|
modeschecked=1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1807,10 +1807,13 @@ static HRESULT WINAPI getvalidmodes_enum(DDSURFACEDESC *ddsd, VOID *udata)
|
||||||
return(DDENUMRET_OK);
|
return(DDENUMRET_OK);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t sortmodes(const struct validmode_t *a, const struct validmode_t *b)
|
static int sortmodes(const void *a_, const void *b_)
|
||||||
{
|
{
|
||||||
int32_t x;
|
int32_t x;
|
||||||
|
|
||||||
|
const struct validmode_t *a = (const struct validmode_t *)a_;
|
||||||
|
const struct validmode_t *b = (const struct validmode_t *)b_;
|
||||||
|
|
||||||
if ((x = a->fs - b->fs) != 0) return x;
|
if ((x = a->fs - b->fs) != 0) return x;
|
||||||
if ((x = a->bpp - b->bpp) != 0) return x;
|
if ((x = a->bpp - b->bpp) != 0) return x;
|
||||||
if ((x = a->xdim - b->xdim) != 0) return x;
|
if ((x = a->xdim - b->xdim) != 0) return x;
|
||||||
|
@ -1867,7 +1870,7 @@ void getvalidmodes(void)
|
||||||
ADDMODE(defaultres[i][0],defaultres[i][1],cdepths[j],0,-1)
|
ADDMODE(defaultres[i][0],defaultres[i][1],cdepths[j],0,-1)
|
||||||
}
|
}
|
||||||
|
|
||||||
qsort((void *)validmode, validmodecnt, sizeof(struct validmode_t), (int32_t( *)(const void *,const void *))sortmodes);
|
qsort((void *)validmode, validmodecnt, sizeof(struct validmode_t), &sortmodes);
|
||||||
|
|
||||||
modeschecked=1;
|
modeschecked=1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -6169,21 +6169,21 @@ static void Keys3d(void)
|
||||||
else if (AIMING_AT_CEILING_OR_FLOOR)
|
else if (AIMING_AT_CEILING_OR_FLOOR)
|
||||||
{
|
{
|
||||||
sector[searchsector].lotag =
|
sector[searchsector].lotag =
|
||||||
_getnumber256("Sector lotag: ", sector[searchsector].lotag, BTAG_MAX, 0, (void *(*)(int32_t))ExtGetSectorType);
|
_getnumber256("Sector lotag: ", sector[searchsector].lotag, BTAG_MAX, 0, &ExtGetSectorType);
|
||||||
}
|
}
|
||||||
else if (AIMING_AT_SPRITE)
|
else if (AIMING_AT_SPRITE)
|
||||||
{
|
{
|
||||||
if (sprite[searchwall].picnum == SECTOREFFECTOR)
|
if (sprite[searchwall].picnum == SECTOREFFECTOR)
|
||||||
{
|
{
|
||||||
sprite[searchwall].lotag =
|
sprite[searchwall].lotag =
|
||||||
_getnumber256("Sprite lotag: ", sprite[searchwall].lotag, BTAG_MAX, 0+j, (void *(*)(int32_t))SectorEffectorTagText);
|
_getnumber256("Sprite lotag: ", sprite[searchwall].lotag, BTAG_MAX, 0+j, &SectorEffectorTagText);
|
||||||
}
|
}
|
||||||
else if (sprite[searchwall].picnum == MUSICANDSFX)
|
else if (sprite[searchwall].picnum == MUSICANDSFX)
|
||||||
{
|
{
|
||||||
int16_t oldtag = sprite[searchwall].lotag;
|
int16_t oldtag = sprite[searchwall].lotag;
|
||||||
|
|
||||||
sprite[searchwall].lotag =
|
sprite[searchwall].lotag =
|
||||||
_getnumber256("Sprite lotag: ", sprite[searchwall].lotag, BTAG_MAX, 0+j, (void *(*)(int32_t))MusicAndSFXTagText);
|
_getnumber256("Sprite lotag: ", sprite[searchwall].lotag, BTAG_MAX, 0+j, &MusicAndSFXTagText);
|
||||||
|
|
||||||
if ((sprite[searchwall].filler&1) && sprite[searchwall].lotag != oldtag)
|
if ((sprite[searchwall].filler&1) && sprite[searchwall].lotag != oldtag)
|
||||||
{
|
{
|
||||||
|
@ -7795,7 +7795,7 @@ static void Keys2d(void)
|
||||||
j = 4*(j&1);
|
j = 4*(j&1);
|
||||||
Bsprintf(buffer,"Sprite (%d) Lo-tag: ", i);
|
Bsprintf(buffer,"Sprite (%d) Lo-tag: ", i);
|
||||||
sprite[i].lotag = _getnumber16(buffer, sprite[i].lotag, BTAG_MAX, 0+j, sprite[i].picnum==SECTOREFFECTOR ?
|
sprite[i].lotag = _getnumber16(buffer, sprite[i].lotag, BTAG_MAX, 0+j, sprite[i].picnum==SECTOREFFECTOR ?
|
||||||
(void *(*)(int32_t))SectorEffectorTagText : NULL);
|
&SectorEffectorTagText : NULL);
|
||||||
}
|
}
|
||||||
else if (linehighlight >= 0)
|
else if (linehighlight >= 0)
|
||||||
{
|
{
|
||||||
|
@ -7819,7 +7819,7 @@ static void Keys2d(void)
|
||||||
{
|
{
|
||||||
Bsprintf(buffer,"Sector (%d) Lo-tag: ", tcursectornum);
|
Bsprintf(buffer,"Sector (%d) Lo-tag: ", tcursectornum);
|
||||||
sector[tcursectornum].lotag =
|
sector[tcursectornum].lotag =
|
||||||
_getnumber16(buffer, sector[tcursectornum].lotag, BTAG_MAX, 0, (void *(*)(int32_t))ExtGetSectorType);
|
_getnumber16(buffer, sector[tcursectornum].lotag, BTAG_MAX, 0, &ExtGetSectorType);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -224,15 +224,15 @@ static inline void __fastcall VM_DoConditional(register int32_t condition)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t X_DoSortDefault(const int32_t *lv, const int32_t *rv)
|
static int X_DoSortDefault(const void *lv, const void *rv)
|
||||||
{
|
{
|
||||||
return (*rv - *lv);
|
return *(int32_t *)rv - *(int32_t *)lv;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t X_DoSort(const int32_t *lv, const int32_t *rv)
|
static int X_DoSort(const void *lv, const void *rv)
|
||||||
{
|
{
|
||||||
m32_sortvar1 = *lv;
|
m32_sortvar1 = *(int32_t *)lv;
|
||||||
m32_sortvar2 = *rv;
|
m32_sortvar2 = *(int32_t *)rv;
|
||||||
insptr = x_sortingstateptr;
|
insptr = x_sortingstateptr;
|
||||||
VM_Execute(0);
|
VM_Execute(0);
|
||||||
return g_iReturnVar;
|
return g_iReturnVar;
|
||||||
|
@ -1213,13 +1213,13 @@ skip_check:
|
||||||
|
|
||||||
if (state < 0)
|
if (state < 0)
|
||||||
{
|
{
|
||||||
qsort(aGameArrays[aridx].vals, count, sizeof(int32_t), (int32_t(*)(const void *,const void *))X_DoSortDefault);
|
qsort(aGameArrays[aridx].vals, count, sizeof(int32_t), X_DoSortDefault);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
x_sortingstateptr = script + statesinfo[state].ofs;
|
x_sortingstateptr = script + statesinfo[state].ofs;
|
||||||
vm.g_st = 1+MAXEVENTS+state;
|
vm.g_st = 1+MAXEVENTS+state;
|
||||||
qsort(aGameArrays[aridx].vals, count, sizeof(int32_t), (int32_t(*)(const void *,const void *))X_DoSort);
|
qsort(aGameArrays[aridx].vals, count, sizeof(int32_t), X_DoSort);
|
||||||
vm.g_st = o_g_st;
|
vm.g_st = o_g_st;
|
||||||
insptr = end;
|
insptr = end;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1076,9 +1076,9 @@ void Net_ReceiveMapUpdate(ENetEvent *event)
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Map State
|
// Map State
|
||||||
|
|
||||||
static int Net_CompareActors(const netactor_t *actor1, const netactor_t *actor2)
|
static int Net_CompareActors(const void *actor1, const void *actor2)
|
||||||
{
|
{
|
||||||
return actor1->netIndex - actor2->netIndex;
|
return ((netactor_t *)actor1)->netIndex - ((netactor_t *)actor2)->netIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Net_SaveMapState(netmapstate_t *save)
|
void Net_SaveMapState(netmapstate_t *save)
|
||||||
|
@ -1112,7 +1112,7 @@ void Net_SaveMapState(netmapstate_t *save)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qsort(save->actor, save->numActors, sizeof(netactor_t), (int( *)(const void *, const void *)) &Net_CompareActors);
|
qsort(save->actor, save->numActors, sizeof(netactor_t), &Net_CompareActors);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Net_FillMapDiff(uint32_t fromRevision, uint32_t toRevision)
|
void Net_FillMapDiff(uint32_t fromRevision, uint32_t toRevision)
|
||||||
|
|
Loading…
Reference in a new issue