mirror of
https://github.com/gbdev/rgbds.git
synced 2025-11-20 18:22:07 +00:00
Add string format checking to err.h functions
And fix all problems this detected... oops
This commit is contained in:
16
include/extern/err.h
vendored
16
include/extern/err.h
vendored
@@ -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 */
|
||||||
|
|
||||||
|
|||||||
@@ -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_
|
||||||
|
|||||||
@@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user