aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorbobsayshilol <bobsayshilol@live.co.uk>2024-10-27 20:11:42 +0000
committerbobsayshilol <bobsayshilol@live.co.uk>2024-10-27 22:02:34 +0000
commitc1496ab6c055974ac401865bdca87a4fc0a76ea3 (patch)
treefd7a6f33af78b224030517c634cdfdc573dab985 /src
parent4f800a7fdaaa430226108e3bb2bf9fafbda41be8 (diff)
Fix passing nullptr to args marked as non-null
libstdc++'s |memcpy| and |memset| both state that their inputs should never be a nullptr since this matches the C spec. Some compilers act on these hints, so we shouldn't unconditionally call these as it would signal to the compiler that they can't be nullptrs. As an example, the following code will always call |do_something()| when compiled with optimisations since GCC version 4.9: ``` void clear(void *ptr, int size) { memset(ptr, 0, size); } void example(void *ptr, int size) { clear(ptr, size); if (ptr != nullptr) do_something(); } ```
Diffstat (limited to 'src')
-rw-r--r--src/gb/gb.h6
-rw-r--r--src/string.cpp1
2 files changed, 6 insertions, 1 deletions
diff --git a/src/gb/gb.h b/src/gb/gb.h
index 1fef4b4f5..f74026c7d 100644
--- a/src/gb/gb.h
+++ b/src/gb/gb.h
@@ -2541,7 +2541,11 @@ gb_inline void const *gb_pointer_add_const(void const *ptr, isize bytes) {
gb_inline void const *gb_pointer_sub_const(void const *ptr, isize bytes) { return cast(void const *)(cast(u8 const *)ptr - bytes); }
gb_inline isize gb_pointer_diff (void const *begin, void const *end) { return cast(isize)(cast(u8 const *)end - cast(u8 const *)begin); }
-gb_inline void gb_zero_size(void *ptr, isize size) { memset(ptr, 0, size); }
+gb_inline void gb_zero_size(void *ptr, isize size) {
+ if (size != 0) {
+ memset(ptr, 0, size);
+ }
+}
#if defined(_MSC_VER) && !defined(__clang__)
diff --git a/src/string.cpp b/src/string.cpp
index 3c7d96934..190b69041 100644
--- a/src/string.cpp
+++ b/src/string.cpp
@@ -156,6 +156,7 @@ gb_internal isize string_index_byte(String const &s, u8 x) {
gb_internal gb_inline bool str_eq(String const &a, String const &b) {
if (a.len != b.len) return false;
+ if (a.len == 0) return true;
return memcmp(a.text, b.text, a.len) == 0;
}
gb_internal gb_inline bool str_ne(String const &a, String const &b) { return !str_eq(a, b); }