ref: dac13ba4bbaccfd6f8e64466bb27826a18d7e7f1
parent: 702075eba6c9bbb05353a796f4573c45b3b5ea8e
author: ISSOtm <[email protected]>
date: Mon Feb 24 11:58:40 EST 2020
Add string format checking to err.h functions And fix all problems this detected... oops
--- a/include/extern/err.h
+++ b/include/extern/err.h
@@ -29,15 +29,15 @@
#define errx rgbds_errx
#define verrx rgbds_verrx
-void warn(const char *fmt, ...);
-void vwarn(const char *fmt, va_list ap);
-void warnx(const char *fmt, ...);
-void vwarnx(const char *fmt, va_list ap);
+void warn(const char *fmt, ...) format_(printf, 1, 2);
+void vwarn(const char *fmt, va_list ap) format_(printf, 1, 0);
+void warnx(const char *fmt, ...) format_(printf, 1, 2);
+void vwarnx(const char *fmt, va_list ap) format_(printf, 1, 0);
-noreturn_ void err(int status, const char *fmt, ...);
-noreturn_ void verr(int status, const char *fmt, va_list ap);
-noreturn_ void errx(int status, const char *fmt, ...);
-noreturn_ void verrx(int status, const char *fmt, va_list ap);
+noreturn_ void err(int status, const char *fmt, ...) format_(printf, 2, 3);
+noreturn_ void verr(int status, const char *fmt, va_list ap) format_(printf, 2, 0);
+noreturn_ void errx(int status, const char *fmt, ...) format_(printf, 2, 3);
+noreturn_ void verrx(int status, const char *fmt, va_list ap) format_(printf, 2, 0);
#endif /* ERR_IN_LIBC */
--- a/include/helpers.h
+++ b/include/helpers.h
@@ -11,11 +11,14 @@
#ifdef __GNUC__
/* GCC or compatible */
+ #define format_(archetype, str_index, first_arg) \
+ __attribute__ ((format (archetype, str_index, first_arg)))
#define noreturn_ __attribute__ ((noreturn))
#define unused_ __attribute__ ((unused))
#define trap_ __builtin_trap()
#else
/* Unsupported, but no need to throw a fit */
+ #define format_(archetype, str_index, first_arg)
#define noreturn_
#define unused_
#define trap_
--- a/src/asm/main.c
+++ b/src/asm/main.c
@@ -6,7 +6,9 @@
* SPDX-License-Identifier: MIT
*/
+#include <errno.h>
#include <float.h>
+#include <inttypes.h>
#include <math.h>
#include <stdarg.h>
#include <stdio.h>
@@ -14,7 +16,6 @@
#include <stdlib.h>
#include <string.h>
#include <time.h>
-#include <errno.h>
#include "asm/symbol.h"
#include "asm/fstack.h"
@@ -532,15 +533,15 @@
opt_SetCurrentOptions(&DefaultOptions);
if (yyparse() != 0 || nbErrors != 0)
- errx(1, "Assembly aborted (%ld errors)!", nbErrors);
+ errx(1, "Assembly aborted (%u errors)!", nbErrors);
if (dependfile)
fclose(dependfile);
if (nIFDepth != 0)
- errx(1, "Unterminated IF construct (%ld levels)!", nIFDepth);
+ errx(1, "Unterminated IF construct (%u levels)!", nIFDepth);
if (nUnionDepth != 0) {
- errx(1, "Unterminated UNION construct (%ld levels)!",
+ errx(1, "Unterminated UNION construct (%u levels)!",
nUnionDepth);
}
--- a/src/link/assign.c
+++ b/src/link/assign.c
@@ -412,7 +412,7 @@
/* Overlaying requires only fully-constrained sections */
verbosePrint("Assigning other sections...\n");
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");
/* Assign all remaining sections by decreasing constraint order */
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -226,7 +226,8 @@
if (nbElementsRead != patch->rpnSize)
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;
}
@@ -255,7 +256,7 @@
fileName, section->name);
section->isAddressFixed = tmp >= 0;
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;
tryReadlong(tmp, file, "%s: Cannot read \"%s\"'s bank: %s",
fileName, section->name);
--- a/src/link/patch.c
+++ b/src/link/patch.c
@@ -243,7 +243,7 @@
struct Symbol const *symbolDefinition =
sym_GetSymbol(symbol->name);
if (!symbolDefinition)
- errx(1, "%s(%d): Unknown symbol \"%s\"",
+ errx(1, "%s: Unknown symbol \"%s\"",
patch->fileName, symbol->name);
symbol = symbolDefinition;
}
--- a/src/link/section.c
+++ b/src/link/section.c
@@ -111,7 +111,7 @@
/* Check if section has a chance to be placed */
if (section->size > maxsize[section->type])
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 */