| @@ -289,8 +289,19 @@ static uint32_t hashlittle( const void *key, size_t length, uint32_t initval) | |||||
| * does it on word boundaries, so is OK with this. But VALGRIND will | * does it on word boundaries, so is OK with this. But VALGRIND will | ||||
| * still catch it and complain. The masking trick does make the hash | * still catch it and complain. The masking trick does make the hash | ||||
| * noticably faster for short strings (like English words). | * noticably faster for short strings (like English words). | ||||
| * AddressSanitizer is similarly picky about overrunning | |||||
| * the buffer. (http://clang.llvm.org/docs/AddressSanitizer.html | |||||
| */ | */ | ||||
| #ifndef VALGRIND | |||||
| #ifdef VALGRIND | |||||
| # define PRECISE_MEMORY_ACCESS 1 | |||||
| #elif defined(__SANITIZE_ADDRESS__) /* GCC's ASAN */ | |||||
| # define PRECISE_MEMORY_ACCESS 1 | |||||
| #elif defined(__has_feature) | |||||
| # if __has_feature(address_sanitizer) /* Clang's ASAN */ | |||||
| # define PRECISE_MEMORY_ACCESS 1 | |||||
| # endif | |||||
| #endif | |||||
| #ifndef PRECISE_MEMORY_ACCESS | |||||
| switch(length) | switch(length) | ||||
| { | { | ||||