From d9586c8d382c00724e8684ddaa043e303620f9b2 Mon Sep 17 00:00:00 2001 From: Thad House Date: Wed, 26 Jul 2017 20:59:40 -0700 Subject: [PATCH] Fixes JNI aliasing issues involving ControlWord and AllianceStation (#575) --- wpilibj/src/athena/cpp/lib/HAL.cpp | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/wpilibj/src/athena/cpp/lib/HAL.cpp b/wpilibj/src/athena/cpp/lib/HAL.cpp index 13f0c03ea0..6dcceb89a6 100644 --- a/wpilibj/src/athena/cpp/lib/HAL.cpp +++ b/wpilibj/src/athena/cpp/lib/HAL.cpp @@ -120,10 +120,14 @@ Java_edu_wpi_first_wpilibj_hal_HAL_report( JNIEXPORT jint JNICALL Java_edu_wpi_first_wpilibj_hal_HAL_nativeGetControlWord(JNIEnv*, jclass) { NETCOMM_LOG(logDEBUG) << "Calling HAL Control Word"; + static_assert(sizeof(HAL_ControlWord) == sizeof(jint), + "Java int must match the size of control word"); HAL_ControlWord controlWord; std::memset(&controlWord, 0, sizeof(HAL_ControlWord)); HAL_GetControlWord(&controlWord); - return *reinterpret_cast(&controlWord); + jint retVal = 0; + std::memcpy(&retVal, &controlWord, sizeof(HAL_ControlWord)); + return retVal; } /* @@ -136,7 +140,7 @@ Java_edu_wpi_first_wpilibj_hal_HAL_nativeGetAllianceStation(JNIEnv*, jclass) { NETCOMM_LOG(logDEBUG) << "Calling HAL Alliance Station"; int32_t status = 0; auto allianceStation = HAL_GetAllianceStation(&status); - return *reinterpret_cast(&allianceStation); + return static_cast(allianceStation); } /*