From 0b4ecef91c65d828c27cde6b73105b944ea1dcfa Mon Sep 17 00:00:00 2001 From: Bob Supnik Date: Mon, 15 Apr 2019 19:15:02 -0700 Subject: [PATCH] SCP: Coverity warning cleanup from Dave Bryan --- sim_console.c | 3 ++ sim_fio.c | 50 +++++++++++------------------ sim_tape.c | 87 ++++++++++++++++++++++++++++++++++++--------------- 3 files changed, 83 insertions(+), 57 deletions(-) diff --git a/sim_console.c b/sim_console.c index add72600..b818d888 100644 --- a/sim_console.c +++ b/sim_console.c @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 27-Dec-18 JDB Added missing fall through comment in ControlHandler 18-Mar-18 RMS Fixed deboff not to close stdout or stderr (Dave Bryan) 31-Mar-15 RMS Backported parity feature from GitHub master 10-Nov-14 JDB Added -N option to SET CONSOLE LOG and SET CONSOLE DEBUG @@ -770,6 +771,8 @@ ControlHandler(DWORD dwCtrlType) case CTRL_LOGOFF_EVENT: // User is logging off if (!GetConsoleMode(GetStdHandle(STD_INPUT_HANDLE), &Mode)) return TRUE; // Not our User, so ignore + /* fall through into simulation termination */ + case CTRL_SHUTDOWN_EVENT: // System is shutting down int_handler(0); return TRUE; diff --git a/sim_fio.c b/sim_fio.c index 23989705..c86d67bd 100644 --- a/sim_fio.c +++ b/sim_fio.c @@ -1,6 +1,6 @@ /* sim_fio.c: simulator file I/O library - Copyright (c) 1993-2015, Robert M Supnik + Copyright (c) 1993-2018, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -23,6 +23,7 @@ used in advertising or otherwise to promote the sale, use or other dealings in this Software without prior written authorization from Robert M Supnik. + 28-Dec-18 JDB Modify sim_fseeko, sim_ftell for mingwrt 5.2 compatibility 02-Apr-15 RMS Backported from GitHub master 28-Jun-07 RMS Added VMS IA64 support (from Norm Lastovica) 10-Jul-06 RMS Fixed linux conditionalization (from Chaskiel Grundman) @@ -233,42 +234,29 @@ return (t_offset)(ftell (st)); #define S_SIM_IO_FSEEK_EXT_ 1 #include +/* [JDB] The previous Win32 versions of sim_fseeko and sim_ftell attempted to + use fsetpos and fgetpos by manipulating an fpos_t value as though it were a + 64-bit integer. This worked with version 5.0 of the mingw runtime library, + which declared an fpos_t to be a long long int. With version 5.2, fpos_t is + now a union containing a long long int, so that it cannot be manipulated. + The manipulation was always suspect, as the MSVC++ 2008 documentation says, + "The [fpos_t] value is stored in an internal format and is intended for use + only by fgetpos and fsetpos." It worked, but only because VC++ declared it + as an __int64 value. If that changes, the original code would break, as it + now does for mingw. + + Therefore, we now simply call _fseeki64 and _ftelli64, which are provided by + both mingw and VC++ and work as expected without manipulation. +*/ + int sim_fseeko (FILE *st, t_offset offset, int whence) { -fpos_t fileaddr; -struct _stati64 statb; - -switch (whence) { - - case SEEK_SET: - fileaddr = (fpos_t)offset; - break; - - case SEEK_END: - if (_fstati64 (_fileno (st), &statb)) - return (-1); - fileaddr = statb.st_size + offset; - break; - case SEEK_CUR: - if (fgetpos (st, &fileaddr)) - return (-1); - fileaddr = fileaddr + offset; - break; - - default: - errno = EINVAL; - return (-1); - } - -return fsetpos (st, &fileaddr); +return _fseeki64 (st, offset, whence); } t_offset sim_ftell (FILE *st) { -fpos_t fileaddr; -if (fgetpos (st, &fileaddr)) - return (-1); -return (t_offset)fileaddr; +return (t_offset) _ftelli64 (st); } #endif /* end Windows */ diff --git a/sim_tape.c b/sim_tape.c index 7b307026..c735f368 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -1,6 +1,6 @@ /* sim_tape.c: simulator tape support library - Copyright (c) 1993-2017, Robert M Supnik + Copyright (c) 1993-2018, Robert M Supnik Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -26,6 +26,7 @@ Ultimately, this will be a place to hide processing of various tape formats, as well as OS-specific direct hardware access. + 27-Dec-18 JDB Added missing fall through comment in sim_tape_wrrecf 03-May-17 JDB Added support for erasing tape marks to sim_tape_errec[fr] 02-May-17 JDB Added error checks to sim_fseek calls 18-Jul-16 JDB Added sim_tape_errecf, sim_tape_errecr functions @@ -109,13 +110,10 @@ static const uint32 bpi [] = { /* tape density table, i #define BPI_COUNT (sizeof (bpi) / sizeof (bpi [0])) /* count of density table entries */ -extern int32 sim_switches; - -t_stat sim_tape_ioerr (UNIT *uptr); -t_stat sim_tape_wrdata (UNIT *uptr, uint32 dat); -uint32 sim_tape_tpc_map (UNIT *uptr, t_addr *map); -t_addr sim_tape_tpc_fnd (UNIT *uptr, t_addr *map); - +static t_stat sim_tape_ioerr (UNIT *uptr); +static t_stat sim_tape_wrdata (UNIT *uptr, uint32 dat); +static uint32 sim_tape_tpc_map (UNIT *uptr, t_addr *map); +static t_addr sim_tape_tpc_fnd (UNIT *uptr, t_addr *map); static t_stat tape_erase_fwd (UNIT *uptr, t_mtrlnt gap_size); static t_stat tape_erase_rev (UNIT *uptr, t_mtrlnt gap_size); @@ -290,7 +288,7 @@ t_tpclnt tpcbc; t_mtrlnt buffer [256]; /* local tape buffer */ uint32 bufcntr, bufcap; /* buffer counter and capacity */ int32 runaway_counter, sizeof_gap; /* bytes remaining before runaway and bytes per gap */ -t_stat status = SCPE_OK; +t_stat status = MTSE_OK; MT_CLR_PNU (uptr); /* clear the position-not-updated flag */ @@ -463,7 +461,7 @@ else switch (f) { /* otherwise the read me all_eof = 0; } - if (status == SCPE_OK) { + if (status == MTSE_OK) { *bc = sbc; /* save rec lnt */ sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */ uptr->pos = uptr->pos + sbc; /* spc over record */ @@ -515,7 +513,6 @@ return status; 2. See the notes at "sim_tape_rdlntf" and "tape_erase_fwd" regarding tape runaway and the erase gap implementation, respectively. - */ static t_stat sim_tape_rdlntr (UNIT *uptr, t_mtrlnt *bc) @@ -529,7 +526,7 @@ t_tpclnt tpcbc; t_mtrlnt buffer [256]; /* local tape buffer */ uint32 bufcntr, bufcap; /* buffer counter and capacity */ int32 runaway_counter, sizeof_gap; /* bytes remaining before runaway and bytes per gap */ -t_stat status = SCPE_OK; +t_stat status = MTSE_OK; MT_CLR_PNU (uptr); /* clear the position-not-updated flag */ @@ -671,7 +668,7 @@ else switch (f) { /* otherwise the read me } } - if (status == SCPE_OK) { + if (status == MTSE_OK) { uptr->pos = uptr->pos - sbc; /* update position */ *bc = sbc; /* save rec lnt */ sim_fseek (uptr->fileref, uptr->pos, SEEK_SET); /* for read */ @@ -716,7 +713,8 @@ t_addr opos; t_stat st; opos = uptr->pos; /* old position */ -if (st = sim_tape_rdlntf (uptr, &tbc)) /* read rec lnt */ +st = sim_tape_rdlntf (uptr, &tbc); /* read rec lnt */ +if (st != MTSE_OK) return st; *bc = rbc = MTR_L (tbc); /* strip error flag */ if (rbc > max) { /* rec out of range? */ @@ -724,7 +722,7 @@ if (rbc > max) { /* rec out of range? */ uptr->pos = opos; return MTSE_INVRL; } -i = sim_fread (buf, sizeof (uint8), rbc, uptr->fileref);/* read record */ +i = (t_mtrlnt) sim_fread (buf, sizeof (uint8), rbc, uptr->fileref); /* read record */ if (ferror (uptr->fileref)) { /* error? */ MT_SET_PNU (uptr); uptr->pos = opos; @@ -765,12 +763,13 @@ uint32 f = MT_GET_FMT (uptr); t_mtrlnt i, rbc, tbc; t_stat st; -if (st = sim_tape_rdlntr (uptr, &tbc)) /* read rec lnt */ +st = sim_tape_rdlntr (uptr, &tbc); /* read rec lnt */ +if (st != MTSE_OK) return st; *bc = rbc = MTR_L (tbc); /* strip error flag */ if (rbc > max) /* rec out of range? */ return MTSE_INVRL; -i = sim_fread (buf, sizeof (uint8), rbc, uptr->fileref);/* read record */ +i = (t_mtrlnt) sim_fread (buf, sizeof (uint8), rbc, uptr->fileref); /* read record */ if (ferror (uptr->fileref)) /* error? */ return sim_tape_ioerr (uptr); for ( ; i < rbc; i++) /* fill with 0's */ @@ -815,6 +814,9 @@ switch (f) { /* case on format */ case MTUF_F_STD: /* standard */ sbc = MTR_L ((bc + 1) & ~1); /* pad odd length */ + + /* fall through into the E11 handler */ + case MTUF_F_E11: /* E11 */ sim_fwrite (&bc, sizeof (t_mtrlnt), 1, uptr->fileref); sim_fwrite (buf, sizeof (uint8), sbc, uptr->fileref); @@ -843,7 +845,7 @@ return MTSE_OK; /* Write metadata forward (internal routine) */ -t_stat sim_tape_wrdata (UNIT *uptr, uint32 dat) +static t_stat sim_tape_wrdata (UNIT *uptr, uint32 dat) { MT_CLR_PNU (uptr); if ((uptr->flags & UNIT_ATT) == 0) /* not attached? */ @@ -1360,7 +1362,23 @@ else /* otherwise */ return tape_erase_rev (uptr, gap_size); /* erase the requested gap */ } -/* Space record forward */ +/* Space record forward + + Inputs: + uptr = pointer to tape unit + bc = pointer to size of record skipped + Outputs: + status = operation status + + exit condition position + + unit unattached unchanged + read error unchanged, PNU set + end of file/medium unchanged, PNU set + tape mark updated + data record updated + data record error updated +*/ t_stat sim_tape_sprecf (UNIT *uptr, t_mtrlnt *bc) { @@ -1371,7 +1389,24 @@ st = sim_tape_rdlntf (uptr, bc); /* get record length */ return st; } -/* Space record reverse */ +/* Space record reverse + + Inputs: + uptr = pointer to tape unit + bc = pointer to size of records skipped + Outputs: + status = operation status + + exit condition position + + unit unattached unchanged + beginning of tape unchanged + read error unchanged + end of file unchanged + end of medium updated + tape mark updated + data record updated +*/ t_stat sim_tape_sprecr (UNIT *uptr, t_mtrlnt *bc) { @@ -1424,12 +1459,12 @@ return (uptr->capac && (uptr->pos >= uptr->capac))? TRUE: FALSE; t_bool sim_tape_wrp (UNIT *uptr) { -return (uptr->flags & MTUF_WRP)? TRUE: FALSE; +return ((uptr->flags & MTUF_WRP) || (MT_GET_FMT (uptr) == MTUF_F_TPC))? TRUE: FALSE; } /* Process I/O error */ -t_stat sim_tape_ioerr (UNIT *uptr) +static t_stat sim_tape_ioerr (UNIT *uptr) { perror ("Magtape library I/O error"); clearerr (uptr->fileref); @@ -1442,10 +1477,10 @@ t_stat sim_tape_set_fmt (UNIT *uptr, int32 val, char *cptr, void *desc) { uint32 f; -if (uptr->flags & UNIT_ATT) - return SCPE_ALATT; if (uptr == NULL) return SCPE_IERR; +if (uptr->flags & UNIT_ATT) + return SCPE_ALATT; if (cptr == NULL) return SCPE_ARG; for (f = 0; f < MTUF_N_FMT; f++) { @@ -1472,7 +1507,7 @@ return SCPE_OK; /* Map a TPC format tape image */ -uint32 sim_tape_tpc_map (UNIT *uptr, t_addr *map) +static uint32 sim_tape_tpc_map (UNIT *uptr, t_addr *map) { t_addr tpos; t_tpclnt bc; @@ -1496,7 +1531,7 @@ return objc; /* Find the preceding record in a TPC file */ -t_addr sim_tape_tpc_fnd (UNIT *uptr, t_addr *map) +static t_addr sim_tape_tpc_fnd (UNIT *uptr, t_addr *map) { uint32 lo, hi, p;