From 6755025310335abdb655c11fc65801fee99bb3d9 Mon Sep 17 00:00:00 2001 From: Markus Wick Date: Thu, 10 Jun 2021 21:07:27 +0200 Subject: [PATCH] Fix GCC undefined behavior sanitizer. * Wrong alignment in u64 LOG_DEBUG -> memcpy. * Huge shift exponent in stride calculation for linear buffer, unused result -> skipped. * Large shift in buffer cache if word = 0, skip checking for set bits. Non of those were critical, so this should not change any behavior. At least with the assumption, that the last one used masking behavior, which always yield continuous_bits = 0. --- src/core/file_sys/program_metadata.cpp | 4 +++- src/video_core/buffer_cache/buffer_base.h | 3 +++ src/video_core/texture_cache/util.cpp | 3 +++ 3 files changed, 9 insertions(+), 1 deletion(-) diff --git a/src/core/file_sys/program_metadata.cpp b/src/core/file_sys/program_metadata.cpp index 83b83a0443..01ae1a5676 100644 --- a/src/core/file_sys/program_metadata.cpp +++ b/src/core/file_sys/program_metadata.cpp @@ -150,7 +150,9 @@ void ProgramMetadata::Print() const { LOG_DEBUG(Service_FS, " > Is Retail: {}", acid_header.is_retail ? "YES" : "NO"); LOG_DEBUG(Service_FS, "Title ID Min: 0x{:016X}", acid_header.title_id_min); LOG_DEBUG(Service_FS, "Title ID Max: 0x{:016X}", acid_header.title_id_max); - LOG_DEBUG(Service_FS, "Filesystem Access: 0x{:016X}\n", acid_file_access.permissions); + u64_le permissions_l; // local copy to fix alignment error + std::memcpy(&permissions_l, &acid_file_access.permissions, sizeof(permissions_l)); + LOG_DEBUG(Service_FS, "Filesystem Access: 0x{:016X}\n", permissions_l); // Begin ACI0 printing (actual perms, unsigned) LOG_DEBUG(Service_FS, "Magic: {:.4}", aci_header.magic.data()); diff --git a/src/video_core/buffer_cache/buffer_base.h b/src/video_core/buffer_cache/buffer_base.h index 0c00ae280e..a395059036 100644 --- a/src/video_core/buffer_cache/buffer_base.h +++ b/src/video_core/buffer_cache/buffer_base.h @@ -476,6 +476,9 @@ private: current_size = 0; on_going = false; } + if (empty_bits == PAGES_PER_WORD) { + break; + } page += empty_bits; const int continuous_bits = std::countr_one(word >> page); diff --git a/src/video_core/texture_cache/util.cpp b/src/video_core/texture_cache/util.cpp index 8c4a5523b3..906604a391 100644 --- a/src/video_core/texture_cache/util.cpp +++ b/src/video_core/texture_cache/util.cpp @@ -647,6 +647,9 @@ u32 CalculateLayerSize(const ImageInfo& info) noexcept { } LevelArray CalculateMipLevelOffsets(const ImageInfo& info) noexcept { + if (info.type == ImageType::Linear) { + return {}; + } ASSERT(info.resources.levels <= static_cast(MAX_MIP_LEVELS)); const LevelInfo level_info = MakeLevelInfo(info); LevelArray offsets{};