diff --git a/doc/mimalloc-doc.h b/doc/mimalloc-doc.h
index 16327d2c..57b7dd4c 100644
--- a/doc/mimalloc-doc.h
+++ b/doc/mimalloc-doc.h
@@ -808,7 +808,7 @@ library so all calls to the standard `malloc` interface are
resolved to the _mimalloc_ library.
- `env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram` (on Linux, BSD, etc.)
-- `env DYLD_INSERT_LIBRARIES=usr/lib/libmimalloc.dylib myprogram` (On macOS)
+- `env DYLD_INSERT_LIBRARIES=/usr/lib/libmimalloc.dylib myprogram` (On macOS)
Note certain security restrictions may apply when doing this from
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
diff --git a/docs/overrides.html b/docs/overrides.html
index 16400375..2360a936 100644
--- a/docs/overrides.html
+++ b/docs/overrides.html
@@ -109,7 +109,7 @@ $(document).ready(function(){initNavTree('overrides.html','');});
On these systems we preload the mimalloc shared library so all calls to the standard malloc
interface are resolved to the mimalloc library.
env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram
(on Linux, BSD, etc.)
-env DYLD_INSERT_LIBRARIES=usr/lib/libmimalloc.dylib myprogram
(On macOS)
+env DYLD_INSERT_LIBRARIES=/usr/lib/libmimalloc.dylib myprogram
(On macOS)
Note certain security restrictions may apply when doing this from the shell.
diff --git a/include/mimalloc-internal.h b/include/mimalloc-internal.h
index 3b45ada4..26251878 100644
--- a/include/mimalloc-internal.h
+++ b/include/mimalloc-internal.h
@@ -116,6 +116,9 @@ bool _mi_page_is_valid(mi_page_t* page);
#define mi_likely(x) (x)
#endif
+#ifndef __has_builtin
+#define __has_builtin(x) 0
+#endif
#if defined(_MSC_VER)
#define mi_decl_noinline __declspec(noinline)
@@ -148,9 +151,17 @@ bool _mi_page_is_valid(mi_page_t* page);
// Overflow detecting multiply
#define MI_MUL_NO_OVERFLOW ((size_t)1 << (4*sizeof(size_t))) // sqrt(SIZE_MAX)
static inline bool mi_mul_overflow(size_t size, size_t count, size_t* total) {
+#if __has_builtin(__builtin_umul_overflow) || __GNUC__ >= 5
+#if (MI_INTPTR_SIZE == 4)
+ return __builtin_umul_overflow(size, count, total);
+#else
+ return __builtin_umull_overflow(size, count, total);
+#endif
+#else /* __builtin_umul_overflow is unavailable */
*total = size * count;
return ((size >= MI_MUL_NO_OVERFLOW || count >= MI_MUL_NO_OVERFLOW)
&& size > 0 && (SIZE_MAX / size) < count);
+#endif
}
// Align a byte size to a size in _machine words_,
diff --git a/readme.md b/readme.md
index 85234c24..8ff19deb 100644
--- a/readme.md
+++ b/readme.md
@@ -191,7 +191,7 @@ library so all calls to the standard `malloc` interface are
resolved to the _mimalloc_ library.
- `env LD_PRELOAD=/usr/lib/libmimalloc.so myprogram` (on Linux, BSD, etc.)
-- `env DYLD_INSERT_LIBRARIES=usr/lib/libmimalloc.dylib myprogram` (On macOS)
+- `env DYLD_INSERT_LIBRARIES=/usr/lib/libmimalloc.dylib myprogram` (On macOS)
Note certain security restrictions may apply when doing this from
the [shell](https://stackoverflow.com/questions/43941322/dyld-insert-libraries-ignored-when-calling-application-through-bash).
diff --git a/src/options.c b/src/options.c
index ac0910a0..3cdcf7e6 100644
--- a/src/options.c
+++ b/src/options.c
@@ -58,7 +58,7 @@ static void mi_option_init(mi_option_desc_t* desc);
long mi_option_get(mi_option_t option) {
mi_assert(option >= 0 && option < _mi_option_last);
mi_option_desc_t* desc = &options[option];
- if (desc->init == UNINIT) {
+ if (mi_unlikely(desc->init == UNINIT)) {
mi_option_init(desc);
if (option != mi_option_verbose) {
_mi_verbose_message("option '%s': %ld\n", desc->name, desc->value);
@@ -183,7 +183,8 @@ static void mi_option_init(mi_option_desc_t* desc) {
#pragma warning(suppress:4996)
char* s = getenv(buf);
if (s == NULL) {
- for (size_t i = 0; i < strlen(buf); i++) {
+ size_t buf_size = strlen(buf);
+ for (size_t i = 0; i < buf_size; i++) {
buf[i] = toupper(buf[i]);
}
#pragma warning(suppress:4996)
@@ -191,7 +192,8 @@ static void mi_option_init(mi_option_desc_t* desc) {
}
if (s != NULL) {
mi_strlcpy(buf, s, sizeof(buf));
- for (size_t i = 0; i < strlen(buf); i++) {
+ size_t buf_size = strlen(buf); // TODO: use strnlen?
+ for (size_t i = 0; i < buf_size; i++) {
buf[i] = toupper(buf[i]);
}
if (buf[0]==0 || strstr("1;TRUE;YES;ON", buf) != NULL) {
diff --git a/src/os.c b/src/os.c
index 6593906f..d7fb38f9 100644
--- a/src/os.c
+++ b/src/os.c
@@ -209,7 +209,7 @@ static void* mi_win_virtual_alloc(void* addr, size_t size, size_t try_alignment,
void* p = NULL;
if (use_large_os_page(size, try_alignment)) {
if (large_page_try_ok > 0) {
- // if a large page page allocation fails, it seems the calls to VirtualAlloc get very expensive.
+ // if a large page allocation fails, it seems the calls to VirtualAlloc get very expensive.
// therefore, once a large page allocation failed, we don't try again for `large_page_try_ok` times.
large_page_try_ok--;
}