From 05e78fa5231acaea42b2ba01e8abaf7c26535678 Mon Sep 17 00:00:00 2001 From: olemorud Date: Tue, 25 Apr 2023 07:22:07 +0200 Subject: [PATCH] Add error handling for read_number and fix it --- Makefile | 4 ++-- src/main.c | 2 +- src/parse.c | 14 ++++++++++++-- 3 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index 1d55a35..0baf282 100644 --- a/Makefile +++ b/Makefile @@ -12,11 +12,11 @@ CC := gcc # -fsanitize={address,undefined} CFLAGS.gcc.debug := -Og -ggdb -fanalyzer -DBACKTRACE -rdynamic -fsanitize=address -fno-omit-frame-pointer CFLAGS.gcc.release := -O3 -g -march=native -DNDEBUG -CFLAGS.gcc := ${CFLAGS.gcc.${BUILD}} -Iinclude -Wall -Wextra -Wpedantic -Werror -fstack-protector-all -std=gnu11 +CFLAGS.gcc := ${CFLAGS.gcc.${BUILD}} -Iinclude -Wall -Wextra -Wpedantic -Werror -Wno-strict-aliasing -fstack-protector-all -std=gnu11 CFLAGS.clang.debug=-O0 -g3 -DBACKTRACE -rdynamic CFLAGS.clang.release=-O3 -g -march=native -DNDEBUG -CFLAGS.clang=-Wextra -Wall -Wpedantic -Werror -fstack-protector-all ${CFLAGS.clang.${BUILD}} +CFLAGS.clang=-Iinclude -Wall -Wextra -Wpedantic -Werror -Wno-strict-aliasing -fstack-protector-all ${CFLAGS.clang.${BUILD}} CFLAGS := ${CFLAGS.${COMPILER}} diff --git a/src/main.c b/src/main.c index a1c6453..08f3ad4 100644 --- a/src/main.c +++ b/src/main.c @@ -36,7 +36,7 @@ int main(int argc, char* argv[]) struct json_value x = parse_json_value(fp); - print_json(x, 1); + // print_json(x, 1); json_value_delete(x); diff --git a/src/parse.c b/src/parse.c index baa2101..b5d50e1 100644 --- a/src/parse.c +++ b/src/parse.c @@ -106,6 +106,7 @@ struct json_value parse_json_value(FILE* fp) default: if (isdigit(c)) { + ungetc(c, fp); result.type = number; result.number = read_number(fp); } else { @@ -364,9 +365,18 @@ bool read_boolean(FILE* fp) */ double read_number(FILE* fp) { - double n; + static const unsigned long neg_nan = 0xFFFFFFFFFFFFFFFFULL; + double n = *(double*)&neg_nan; - fscanf(fp, "%lf", &n); + int n_read = fscanf(fp, "%lf", &n); + + /* try to read as long instead */ + if (n_read == 0) { + err_ctx(UNEXPECTED_CHAR, fp, "(%s) number expected, found %lf", __func__, n); + } + + if (n_read == EOF) + err_ctx(EARLY_EOF, fp, "(%s) unexpected EOF", __func__); return n; }