Add a pointer alignment helper function.
Also use a slightly more conservative pattern. Instead of aligning the
pointer as a uintptr_t and casting back, compute the offset and advance
in pointer space. C guarantees that casting from pointer to uintptr_t
and back gives the same pointer, but general integer-to-pointer
conversions are generally implementation-defined. GCC does define it in
the useful way, but this makes fewer dependencies.
Change-Id: I70c7af735e892fe7a8333b78b39d7b1f3f1cdbef
Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/48405
Reviewed-by: Adam Langley <alangley@gmail.com>
diff --git a/tool/speed.cc b/tool/speed.cc
index 1b89b42..264334f 100644
--- a/tool/speed.cc
+++ b/tool/speed.cc
@@ -342,12 +342,6 @@
return true;
}
-static uint8_t *align(uint8_t *in, unsigned alignment) {
- return reinterpret_cast<uint8_t *>(
- (reinterpret_cast<uintptr_t>(in) + alignment) &
- ~static_cast<size_t>(alignment - 1));
-}
-
static std::string ChunkLenSuffix(size_t chunk_len) {
char buf[32];
snprintf(buf, sizeof(buf), " (%zu byte%s)", chunk_len,
@@ -384,13 +378,17 @@
new uint8_t[overhead_len + kAlignment]);
- uint8_t *const in = align(in_storage.get(), kAlignment);
+ uint8_t *const in =
+ static_cast<uint8_t *>(align_pointer(in_storage.get(), kAlignment));
OPENSSL_memset(in, 0, chunk_len);
- uint8_t *const out = align(out_storage.get(), kAlignment);
+ uint8_t *const out =
+ static_cast<uint8_t *>(align_pointer(out_storage.get(), kAlignment));
OPENSSL_memset(out, 0, chunk_len + overhead_len);
- uint8_t *const tag = align(tag_storage.get(), kAlignment);
+ uint8_t *const tag =
+ static_cast<uint8_t *>(align_pointer(tag_storage.get(), kAlignment));
OPENSSL_memset(tag, 0, overhead_len);
- uint8_t *const in2 = align(in2_storage.get(), kAlignment);
+ uint8_t *const in2 =
+ static_cast<uint8_t *>(align_pointer(in2_storage.get(), kAlignment));
if (!EVP_AEAD_CTX_init_with_direction(ctx.get(), aead, key.get(), key_len,
EVP_AEAD_DEFAULT_TAG_LENGTH,