19254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan/* Copyright (c) 2017, Google Inc. 29254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * 39254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * Permission to use, copy, modify, and/or distribute this software for any 49254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * purpose with or without fee is hereby granted, provided that the above 59254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * copyright notice and this permission notice appear in all copies. 69254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * 79254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 89254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 99254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 109254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 119254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION 129254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN 139254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ 149254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 159254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan#include <limits.h> 169254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan#include <stdint.h> 179254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 189254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan#include <type_traits> 199254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 209254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan#include <gtest/gtest.h> 219254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 229254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan#include "test/test_util.h" 239254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 249254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 259254e681d446a8105bd66f08bae1252d4d89a139Robert Sloantemplate <typename T> 269254e681d446a8105bd66f08bae1252d4d89a139Robert Sloanstatic void CheckRepresentation(T value) { 279254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan SCOPED_TRACE(value); 289254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 299254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // Convert to the corresponding two's-complement unsigned value. We use an 309254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // unsigned value so the right-shift below has defined value. Right-shifts of 319254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // negative numbers in C are implementation defined. 329254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // 339254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // If |T| is already unsigned, this is a no-op, as desired. 349254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // 359254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // If |T| is signed, conversion to unsigned is defined to repeatedly add or 369254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // subtract (numerically, not within |T|) one more than the unsigned type's 379254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // maximum value until it fits (this must be a power of two). This is the 389254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // conversion we want. 399254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan using UnsignedT = typename std::make_unsigned<T>::type; 409254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan UnsignedT value_u = static_cast<UnsignedT>(value); 419254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(sizeof(UnsignedT), sizeof(T)); 429254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 439254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // Integers must be little-endian. 449254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan uint8_t expected[sizeof(UnsignedT)]; 459254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan for (size_t i = 0; i < sizeof(UnsignedT); i++) { 469254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan expected[i] = static_cast<uint8_t>(value_u); 479254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // Divide instead of right-shift to appease compilers that warn if |T| is a 489254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // char. The explicit cast is also needed to appease MSVC if integer 499254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // promotion happened. 509254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan value_u = static_cast<UnsignedT>(value_u / 256); 519254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan } 529254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(0u, value_u); 539254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 549254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // Check that |value| has the expected representation. 559254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(Bytes(expected), 569254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan Bytes(reinterpret_cast<const uint8_t *>(&value), sizeof(value))); 579254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan} 589254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 599254e681d446a8105bd66f08bae1252d4d89a139Robert SloanTEST(CompilerTest, IntegerRepresentation) { 609254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(8, CHAR_BIT); 619254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(0xff, static_cast<int>(UCHAR_MAX)); 629254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 639254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // uint8_t is assumed to be unsigned char. I.e., casting to uint8_t should be 649254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // as good as unsigned char for strict aliasing purposes. 659254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan uint8_t u8 = 0; 669254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan unsigned char *ptr = &u8; 679254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan (void)ptr; 689254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 699254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // Sized integers have the expected size. 709254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(1u, sizeof(uint8_t)); 719254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(2u, sizeof(uint16_t)); 729254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(4u, sizeof(uint32_t)); 739254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(8u, sizeof(uint64_t)); 749254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 759254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // size_t does not exceed uint64_t. 769254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_LE(sizeof(size_t), 8u); 779254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 789254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan // int must be 32-bit or larger. 799254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_LE(0x7fffffff, INT_MAX); 809254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_LE(0xffffffffu, UINT_MAX); 819254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 829254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<signed char>(127)); 839254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<signed char>(1)); 849254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<signed char>(0)); 859254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<signed char>(-1)); 869254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<signed char>(-42)); 879254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<signed char>(-128)); 889254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 899254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int>(INT_MAX)); 909254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int>(0x12345678)); 919254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int>(1)); 929254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int>(0)); 939254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int>(-1)); 949254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int>(-0x12345678)); 959254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int>(INT_MIN)); 969254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 979254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned>(UINT_MAX)); 989254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned>(0x12345678)); 999254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned>(1)); 1009254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned>(0)); 1019254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1029254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<long>(LONG_MAX)); 1039254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<long>(0x12345678)); 1049254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<long>(1)); 1059254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<long>(0)); 1069254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<long>(-1)); 1079254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<long>(-0x12345678)); 1089254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<long>(LONG_MIN)); 1099254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1109254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned long>(ULONG_MAX)); 1119254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned long>(0x12345678)); 1129254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned long>(1)); 1139254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<unsigned long>(0)); 1149254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1159254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int16_t>(0x7fff)); 1169254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int16_t>(0x1234)); 1179254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int16_t>(1)); 1189254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int16_t>(0)); 1199254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int16_t>(-1)); 1209254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int16_t>(-0x7fff - 1)); 1219254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1229254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint16_t>(0xffff)); 1239254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint16_t>(0x1234)); 1249254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint16_t>(1)); 1259254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint16_t>(0)); 1269254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1279254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int32_t>(0x7fffffff)); 1289254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int32_t>(0x12345678)); 1299254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int32_t>(1)); 1309254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int32_t>(0)); 1319254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int32_t>(-1)); 1329254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int32_t>(-0x7fffffff - 1)); 1339254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1349254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint32_t>(0xffffffff)); 1359254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint32_t>(0x12345678)); 1369254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint32_t>(1)); 1379254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint32_t>(0)); 1389254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1399254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int64_t>(0x7fffffffffffffff)); 1409254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int64_t>(0x123456789abcdef0)); 1419254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int64_t>(1)); 1429254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int64_t>(0)); 1439254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int64_t>(-1)); 1449254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<int64_t>(-0x7fffffffffffffff - 1)); 1459254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1469254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint64_t>(0xffffffffffffffff)); 1479254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint64_t>(0x12345678abcdef0)); 1489254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint64_t>(1)); 1499254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan CheckRepresentation(static_cast<uint64_t>(0)); 1509254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan} 1519254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1529254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan// Converting pointers to integers and doing arithmetic on those values are both 1539254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan// defined. Converting those values back into pointers is undefined, but, for 1549254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan// aliasing checks, we require that the implementation-defined result of that 1559254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan// computation commutes with pointer arithmetic. 1569254e681d446a8105bd66f08bae1252d4d89a139Robert SloanTEST(CompilerTest, PointerRepresentation) { 1579254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan char chars[256]; 1589254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan for (size_t i = 0; i < sizeof(chars); i++) { 1599254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(reinterpret_cast<uintptr_t>(chars) + i, 1609254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan reinterpret_cast<uintptr_t>(chars + i)); 1619254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan } 1629254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan 1639254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan int ints[256]; 1649254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan for (size_t i = 0; i < OPENSSL_ARRAY_SIZE(ints); i++) { 1659254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan EXPECT_EQ(reinterpret_cast<uintptr_t>(ints) + i * sizeof(int), 1669254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan reinterpret_cast<uintptr_t>(ints + i)); 1679254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan } 1689254e681d446a8105bd66f08bae1252d4d89a139Robert Sloan} 169