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