Prevent UBSAN from generating unsigned overflow diagnostics in the hashing internals

git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@294391 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Eric Fiselier
2017-02-08 00:10:10 +00:00
parent fecf057940
commit 25f28d0c9e
3 changed files with 76 additions and 10 deletions

View File

@@ -0,0 +1,41 @@
//===----------------------------------------------------------------------===//
//
// The LLVM Compiler Infrastructure
//
// This file is dual licensed under the MIT and the University of Illinois Open
// Source Licenses. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
// Test that UBSAN doesn't generate unsigned integer overflow diagnostics
// from within the hashing internals.
#include <utility>
#include <cstdint>
#include <limits>
#include <string>
#include "test_macros.h"
typedef std::__murmur2_or_cityhash<uint32_t> Hash32;
typedef std::__murmur2_or_cityhash<uint64_t> Hash64;
void test(const void* key, int len) {
for (int i=1; i <= len; ++i) {
Hash32 h1;
Hash64 h2;
DoNotOptimize(h1(key, i));
DoNotOptimize(h2(key, i));
}
}
int main() {
const std::string TestCases[] = {
"abcdaoeuaoeclaoeoaeuaoeuaousaotehu]+}sthoasuthaoesutahoesutaohesutaoeusaoetuhasoetuhaoseutaoseuthaoesutaohes"
"00000000000000000000000000000000000000000000000000000000000000000000000",
"1237546895+54+4554985416849484213464984765465464654564565645645646546456546546"
};
const size_t NumCases = sizeof(TestCases)/sizeof(TestCases[0]);
for (size_t i=0; i < NumCases; ++i)
test(TestCases[i].data(), TestCases[i].length());
}