/*
- * Copyright (C) 2012, 2013, 2014
+ * Copyright (C) 2012, 2013, 2014, 2015
* Dale Weiler
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
#define STRLEN_ONES ((size_t)-1/UCHAR_MAX)
#define STRLEN_HIGHS (STRLEN_ONES * (UCHAR_MAX/2+1))
#define STRLEN_HASZERO(X) (((X)-STRLEN_ONES) & ~(X) & STRLEN_HIGHS)
-ASAN_DISABLE size_t hash(const char *key) {
+
+static ASAN_DISABLE size_t hash_strlen(const char *key) {
const char *s = key;
const char *a = s;
const size_t *w;
for (; (uintptr_t)s % STRLEN_ALIGN; s++) {
- if (!*s)
- return hash_murmur((const void *)key, s-a);
+ if (*s)
+ continue;
+ return s-a;
}
VALGRIND_MAKE_MEM_DEFINED(s, STRLEN_ALIGN);
- for (w = (const void *)s; !STRLEN_HASZERO(*w); w++) {
+ for (w = (const size_t *)s; !STRLEN_HASZERO(*w); w++) {
/* Make the next word legal to access */
VALGRIND_MAKE_MEM_DEFINED(w + STRLEN_ALIGN, STRLEN_ALIGN);
}
- for (s = (const void *)w; *s; s++);
+ for (s = (const char *)w; *s; s++);
/* It's not legal to access this area anymore */
VALGRIND_MAKE_MEM_NOACCESS(s + 1, STRLEN_ALIGN);
-
- return hash_murmur((const void *)key, s-a);
+ return s-a;
}
#else
-/* No way to disable asan instrumenting, use strlen. */
+static GMQCC_INLINE size_t hash_strlen(const char *key) {
+ return strlen(key);
+}
+#endif
+
size_t hash(const char *key) {
- return hash_murmur((const void *)key, strlen(key));
+ return hash_murmur((const void *)key, hash_strlen(key));
}
-#endif /*! HAS_ASAN_DISABLE */