jkorous-apple created this revision. jkorous-apple added a project: clang-tools-extra. Herald added subscribers: cfe-commits, ioeric, ilya-biryukov.
The current code is casting pointer to a misaligned type which is undefined behavior. Found by compiling with Undefined Behavior Sanitizer and running tests (check-clang-tools). AFAIK clang produces the same code for reinterpret_cast<>() and memcpy(). Follow-up to: https://reviews.llvm.org/D44575 Repository: rCTE Clang Tools Extra https://reviews.llvm.org/D44576 Files: clangd/index/Index.h Index: clangd/index/Index.h =================================================================== --- clangd/index/Index.h +++ clangd/index/Index.h @@ -59,7 +59,9 @@ friend llvm::hash_code hash_value(const SymbolID &ID) { // We already have a good hash, just return the first bytes. static_assert(sizeof(size_t) <= HashByteLength, "size_t longer than SHA1!"); - return *reinterpret_cast<const size_t *>(ID.HashValue.data()); + size_t Result; + memcpy(&Result, ID.HashValue.data(), sizeof(size_t)); + return llvm::hash_code(Result); } friend llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SymbolID &ID);
Index: clangd/index/Index.h =================================================================== --- clangd/index/Index.h +++ clangd/index/Index.h @@ -59,7 +59,9 @@ friend llvm::hash_code hash_value(const SymbolID &ID) { // We already have a good hash, just return the first bytes. static_assert(sizeof(size_t) <= HashByteLength, "size_t longer than SHA1!"); - return *reinterpret_cast<const size_t *>(ID.HashValue.data()); + size_t Result; + memcpy(&Result, ID.HashValue.data(), sizeof(size_t)); + return llvm::hash_code(Result); } friend llvm::raw_ostream &operator<<(llvm::raw_ostream &OS, const SymbolID &ID);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits