Add string format checking to err.h functions

And fix all problems this detected... oops
This commit is contained in:
ISSOtm
2020-02-24 16:58:40 +01:00
parent 702075eba6
commit dac13ba4bb
7 changed files with 22 additions and 17 deletions

16
include/extern/err.h vendored
View File

@@ -29,15 +29,15 @@
#define errx rgbds_errx #define errx rgbds_errx
#define verrx rgbds_verrx #define verrx rgbds_verrx
void warn(const char *fmt, ...); void warn(const char *fmt, ...) format_(printf, 1, 2);
void vwarn(const char *fmt, va_list ap); void vwarn(const char *fmt, va_list ap) format_(printf, 1, 0);
void warnx(const char *fmt, ...); void warnx(const char *fmt, ...) format_(printf, 1, 2);
void vwarnx(const char *fmt, va_list ap); void vwarnx(const char *fmt, va_list ap) format_(printf, 1, 0);
noreturn_ void err(int status, const char *fmt, ...); noreturn_ void err(int status, const char *fmt, ...) format_(printf, 2, 3);
noreturn_ void verr(int status, const char *fmt, va_list ap); noreturn_ void verr(int status, const char *fmt, va_list ap) format_(printf, 2, 0);
noreturn_ void errx(int status, const char *fmt, ...); noreturn_ void errx(int status, const char *fmt, ...) format_(printf, 2, 3);
noreturn_ void verrx(int status, const char *fmt, va_list ap); noreturn_ void verrx(int status, const char *fmt, va_list ap) format_(printf, 2, 0);
#endif /* ERR_IN_LIBC */ #endif /* ERR_IN_LIBC */

View File

@@ -11,11 +11,14 @@
#ifdef __GNUC__ #ifdef __GNUC__
/* GCC or compatible */ /* GCC or compatible */
#define format_(archetype, str_index, first_arg) \
__attribute__ ((format (archetype, str_index, first_arg)))
#define noreturn_ __attribute__ ((noreturn)) #define noreturn_ __attribute__ ((noreturn))
#define unused_ __attribute__ ((unused)) #define unused_ __attribute__ ((unused))
#define trap_ __builtin_trap() #define trap_ __builtin_trap()
#else #else
/* Unsupported, but no need to throw a fit */ /* Unsupported, but no need to throw a fit */
#define format_(archetype, str_index, first_arg)
#define noreturn_ #define noreturn_
#define unused_ #define unused_
#define trap_ #define trap_

View File

@@ -6,7 +6,9 @@
* SPDX-License-Identifier: MIT * SPDX-License-Identifier: MIT
*/ */
#include <errno.h>
#include <float.h> #include <float.h>
#include <inttypes.h>
#include <math.h> #include <math.h>
#include <stdarg.h> #include <stdarg.h>
#include <stdio.h> #include <stdio.h>
@@ -14,7 +16,6 @@
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <time.h> #include <time.h>
#include <errno.h>
#include "asm/symbol.h" #include "asm/symbol.h"
#include "asm/fstack.h" #include "asm/fstack.h"
@@ -532,15 +533,15 @@ int main(int argc, char *argv[])
opt_SetCurrentOptions(&DefaultOptions); opt_SetCurrentOptions(&DefaultOptions);
if (yyparse() != 0 || nbErrors != 0) if (yyparse() != 0 || nbErrors != 0)
errx(1, "Assembly aborted (%ld errors)!", nbErrors); errx(1, "Assembly aborted (%u errors)!", nbErrors);
if (dependfile) if (dependfile)
fclose(dependfile); fclose(dependfile);
if (nIFDepth != 0) if (nIFDepth != 0)
errx(1, "Unterminated IF construct (%ld levels)!", nIFDepth); errx(1, "Unterminated IF construct (%u levels)!", nIFDepth);
if (nUnionDepth != 0) { if (nUnionDepth != 0) {
errx(1, "Unterminated UNION construct (%ld levels)!", errx(1, "Unterminated UNION construct (%u levels)!",
nUnionDepth); nUnionDepth);
} }

View File

@@ -412,7 +412,7 @@ void assign_AssignSections(void)
/* Overlaying requires only fully-constrained sections */ /* Overlaying requires only fully-constrained sections */
verbosePrint("Assigning other sections...\n"); verbosePrint("Assigning other sections...\n");
if (overlayFileName) if (overlayFileName)
errx(1, "All sections must be fixed when using an overlay file; %u %sn't", errx(1, "All sections must be fixed when using an overlay file; %lu %sn't",
nbSectionsToAssign, nbSectionsToAssign == 1 ? "is" : "are"); nbSectionsToAssign, nbSectionsToAssign == 1 ? "is" : "are");
/* Assign all remaining sections by decreasing constraint order */ /* Assign all remaining sections by decreasing constraint order */

View File

@@ -226,7 +226,8 @@ static void readPatch(FILE *file, struct Patch *patch,
if (nbElementsRead != patch->rpnSize) if (nbElementsRead != patch->rpnSize)
errx(1, "%s: Cannot read \"%s\"'s patch #%u's RPN expression: %s", errx(1, "%s: Cannot read \"%s\"'s patch #%u's RPN expression: %s",
fileName, sectName, i); fileName, sectName, i,
feof(file) ? "Unexpected end of file" : strerror(errno));
patch->rpnExpression = rpnExpression; patch->rpnExpression = rpnExpression;
} }
@@ -255,7 +256,7 @@ static void readSection(FILE *file, struct Section *section,
fileName, section->name); fileName, section->name);
section->isAddressFixed = tmp >= 0; section->isAddressFixed = tmp >= 0;
if (tmp > UINT16_MAX) if (tmp > UINT16_MAX)
errx(1, "\"%s\" is too large (%d)", tmp); errx(1, "\"%s\"'s org' is too large (%d)", section->name, tmp);
section->org = tmp; section->org = tmp;
tryReadlong(tmp, file, "%s: Cannot read \"%s\"'s bank: %s", tryReadlong(tmp, file, "%s: Cannot read \"%s\"'s bank: %s",
fileName, section->name); fileName, section->name);

View File

@@ -243,7 +243,7 @@ static int32_t computeRPNExpr(struct Patch const *patch,
struct Symbol const *symbolDefinition = struct Symbol const *symbolDefinition =
sym_GetSymbol(symbol->name); sym_GetSymbol(symbol->name);
if (!symbolDefinition) if (!symbolDefinition)
errx(1, "%s(%d): Unknown symbol \"%s\"", errx(1, "%s: Unknown symbol \"%s\"",
patch->fileName, symbol->name); patch->fileName, symbol->name);
symbol = symbolDefinition; symbol = symbolDefinition;
} }

View File

@@ -111,7 +111,7 @@ static void doSanityChecks(struct Section *section, void *ptr)
/* Check if section has a chance to be placed */ /* Check if section has a chance to be placed */
if (section->size > maxsize[section->type]) if (section->size > maxsize[section->type])
fail("Section \"%s\" is bigger than the max size for that type: %#x > %#x", fail("Section \"%s\" is bigger than the max size for that type: %#x > %#x",
section->size, maxsize[section->type]); section->name, section->size, maxsize[section->type]);
/* Translate loose constraints to strong ones when they're equivalent */ /* Translate loose constraints to strong ones when they're equivalent */