diff options
author | Ibrahn Sahir <ibrahn.sahir@gmail.com> | 2019-07-29 23:52:59 +0100 |
---|---|---|
committer | Ibrahn Sahir <ibrahn.sahir@gmail.com> | 2019-07-29 23:52:59 +0100 |
commit | 3502a85ba859fe1cad983d78e7b33f8e3d886e8d (patch) | |
tree | db142f8132940a9118ce9264bf5427aadecb5678 /platform | |
parent | ffab25c95a52857d65be9755f4ec750b0a53429c (diff) |
Fix strict-aliasing warning in OS_Windows::get_unix_time.
Diffstat (limited to 'platform')
-rw-r--r-- | platform/windows/os_windows.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index 4c7e35ed88..93d4482279 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -2252,9 +2252,17 @@ uint64_t OS_Windows::get_unix_time() const { FILETIME fep; SystemTimeToFileTime(&ep, &fep); - // FIXME: dereferencing type-punned pointer will break strict-aliasing rules (GCC warning) + // Type punning through unions (rather than pointer cast) as per: // https://docs.microsoft.com/en-us/windows/desktop/api/minwinbase/ns-minwinbase-filetime#remarks - return (*(uint64_t *)&ft - *(uint64_t *)&fep) / 10000000; + ULARGE_INTEGER ft_punning; + ft_punning.LowPart = ft.dwLowDateTime; + ft_punning.HighPart = ft.dwHighDateTime; + + ULARGE_INTEGER fep_punning; + fep_punning.LowPart = fep.dwLowDateTime; + fep_punning.HighPart = fep.dwHighDateTime; + + return (ft_punning.QuadPart - fep_punning.QuadPart) / 10000000; }; uint64_t OS_Windows::get_system_time_secs() const { |