shithub: rgbds

Download patch

ref: 6fe2741f2dadb165e0361eb171cdd85bad6a6dc6
parent: 24d7cfe0f9fa833be7c4fc3951fdeeaaddbce6c5
author: Antonio Niño Díaz <antonio_nd@outlook.com>
date: Fri Apr 27 20:57:20 EDT 2018

Enable GCC options to detect undefined behaviour

GCC has an Undefined Behavior Sanitizer (ubsan), which enables run-time
checks of undefined behaviour. It has been enabled for the `develop`
build target.

A small bug detected with it has been fixed.

Signed-off-by: Antonio Niño Díaz <antonio_nd@outlook.com>

--- a/Makefile
+++ b/Makefile
@@ -207,7 +207,12 @@
 		-Wstringop-overflow=4 -Walloc-zero -Wduplicated-cond \
 		-Wfloat-equal -Wshadow -Wcast-qual -Wcast-align -Wlogical-op \
 		-Wnested-externs -Wno-aggressive-loop-optimizations -Winline \
-		-Wundef -Wstrict-prototypes -Wold-style-definition"
+		-Wundef -Wstrict-prototypes -Wold-style-definition \
+		-fsanitize=shift -fsanitize=integer-divide-by-zero \
+		-fsanitize=unreachable -fsanitize=vla-bound \
+		-fsanitize=signed-integer-overflow -fsanitize=bounds \
+		-fsanitize=object-size -fsanitize=bool -fsanitize=enum \
+		-fsanitize=alignment -fsanitize=null"
 
 # Targets for the project maintainer to easily create Windows exes.
 # This is not for Windows users!
--- a/src/link/object.c
+++ b/src/link/object.c
@@ -36,14 +36,14 @@
  */
 static int32_t readlong(FILE *f)
 {
-	int32_t r;
+	uint32_t r;
 
-	r = fgetc(f);
-	r |= fgetc(f) << 8;
-	r |= fgetc(f) << 16;
-	r |= fgetc(f) << 24;
+	r = ((uint32_t)(uint8_t)fgetc(f));
+	r |= ((uint32_t)(uint8_t)fgetc(f)) << 8;
+	r |= ((uint32_t)(uint8_t)fgetc(f)) << 16;
+	r |= ((uint32_t)(uint8_t)fgetc(f)) << 24;
 
-	return r;
+	return (int32_t)r;
 }
 
 /*