shithub: rgbds

Download patch

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 */