diff --git a/Common/Data/Encoding/Utf8.cpp b/Common/Data/Encoding/Utf8.cpp index d8531e49de..0374229e9c 100644 --- a/Common/Data/Encoding/Utf8.cpp +++ b/Common/Data/Encoding/Utf8.cpp @@ -322,6 +322,10 @@ void ConvertUTF8ToJavaModifiedUTF8(std::string *output, std::string_view input) output[out_idx++] = (char)0x80; i++; } else if ((c & 0xF0) == 0xF0) { // 4-byte sequence (U+10000 to U+10FFFF) + if (i + 4 > input.length()) { + // Bad. + break; + } // Decode the Unicode code point from the UTF-8 sequence uint32_t code_point = ((input[i] & 0x07) << 18) | ((input[i + 1] & 0x3F) << 12) | @@ -345,6 +349,9 @@ void ConvertUTF8ToJavaModifiedUTF8(std::string *output, std::string_view input) } else if ((c & 0xF0) == 0xE0) { utf8_len = 3; // 3-byte sequence } + if (i + utf8_len > input.length()) { + break; + } memcpy(output->data() + out_idx, input.data() + i, utf8_len); out_idx += utf8_len; i += utf8_len; diff --git a/Common/Thread/Waitable.h b/Common/Thread/Waitable.h index abda42fef9..52870edcf6 100644 --- a/Common/Thread/Waitable.h +++ b/Common/Thread/Waitable.h @@ -30,9 +30,9 @@ public: return true; uint32_t us = budget_s > 0 ? (uint32_t)(budget_s * 1000000.0) : 0; - if (us == 0) + if (us == 0) { return false; - + } std::unique_lock lock(mutex_); return cond_.wait_for(lock, std::chrono::microseconds(us), [&] { return triggered_.load(); }); } diff --git a/Common/UI/Screen.cpp b/Common/UI/Screen.cpp index 20ee69b01d..6cb652c2a2 100644 --- a/Common/UI/Screen.cpp +++ b/Common/UI/Screen.cpp @@ -313,8 +313,10 @@ void ScreenManager::sendMessage(UIMessage message, const char *value) { // NOTE: Changed this to send the message to all screens, instead of just the top one, // to allow EmuScreen to receive messages from popup menus. Hope this didn't break anything.. - for (auto &iter : stack_) { - iter.screen->sendMessage(message, value); + for (const auto &iter : stack_) { + if (iter.screen) { + iter.screen->sendMessage(message, value); + } } } diff --git a/Core/ControlMapper.cpp b/Core/ControlMapper.cpp index f32a6faaa1..4730dbd8d3 100644 --- a/Core/ControlMapper.cpp +++ b/Core/ControlMapper.cpp @@ -160,7 +160,10 @@ void ControlMapper::SetCallbacks( } void ControlMapper::SetPSPAxis(int device, int stick, char axis, float value) { - int axisId = axis == 'X' ? 0 : 1; + const int axisId = axis == 'X' ? 0 : 1; + if (stick != 0 && stick != 1) { + return; + } float position[2]; position[0] = history_[stick][0]; diff --git a/UI/JitCompareScreen.cpp b/UI/JitCompareScreen.cpp index 03044dd729..1f9244ece0 100644 --- a/UI/JitCompareScreen.cpp +++ b/UI/JitCompareScreen.cpp @@ -9,6 +9,9 @@ #include "Core/MIPS/JitCommon/JitState.h" JitCompareScreen::JitCompareScreen() : UIDialogScreenWithBackground() { + if (!MIPSComp::jit) { + return; + } JitBlockCacheDebugInterface *blockCacheDebug = MIPSComp::jit->GetBlockCacheDebugInterface(); // The only defaults that make sense. if (blockCacheDebug->SupportsProfiling()) { diff --git a/UI/JitCompareScreen.h b/UI/JitCompareScreen.h index 8a3828f1e4..0935ca3315 100644 --- a/UI/JitCompareScreen.h +++ b/UI/JitCompareScreen.h @@ -16,15 +16,15 @@ private: // Uses the current ListType void FillBlockList(); - UI::LinearLayout *comparisonView_; - UI::LinearLayout *leftDisasm_; - UI::LinearLayout *rightDisasm_; + UI::LinearLayout *comparisonView_ = nullptr; + UI::LinearLayout *leftDisasm_ = nullptr; + UI::LinearLayout *rightDisasm_ = nullptr; - UI::LinearLayout *blockListView_; - UI::LinearLayout *blockListContainer_; + UI::LinearLayout *blockListView_ = nullptr; + UI::LinearLayout *blockListContainer_ = nullptr; - UI::LinearLayout *statsView_; - UI::LinearLayout *statsContainer_; + UI::LinearLayout *statsView_ = nullptr; + UI::LinearLayout *statsContainer_ = nullptr; UI::EventReturn OnSelectBlock(UI::EventParams &e); UI::EventReturn OnBlockAddress(UI::EventParams &e); @@ -60,9 +60,9 @@ private: int64_t sumExecutions_ = 0; std::vector blockList_; // for BLOCK_LIST mode - UI::TextView *blockName_; - UI::TextEdit *blockAddr_; - UI::TextView *blockStats_; + UI::TextView *blockName_ = nullptr; + UI::TextEdit *blockAddr_ = nullptr; + UI::TextView *blockStats_ = nullptr; }; class AddressPromptScreen : public PopupScreen { diff --git a/UI/MiscScreens.cpp b/UI/MiscScreens.cpp index c8edf028f0..2c16336792 100644 --- a/UI/MiscScreens.cpp +++ b/UI/MiscScreens.cpp @@ -1191,7 +1191,9 @@ void SettingInfoMessage::Show(std::string_view text, const UI::View *refView) { } } } - text_->SetText(text); + if (text_) { + text_->SetText(text); + } timeShown_ = time_now_d(); } diff --git a/UI/TabbedDialogScreen.cpp b/UI/TabbedDialogScreen.cpp index 1758ac7344..c4b3dd81dd 100644 --- a/UI/TabbedDialogScreen.cpp +++ b/UI/TabbedDialogScreen.cpp @@ -116,8 +116,10 @@ void TabbedUIDialogScreenWithGameBackground::RecreateViews() { } void TabbedUIDialogScreenWithGameBackground::EnsureTabs() { - _assert_(tabHolder_); - tabHolder_->EnsureAllCreated(); + _dbg_assert_(tabHolder_); + if (tabHolder_) { + tabHolder_->EnsureAllCreated(); + } } void TabbedUIDialogScreenWithGameBackground::ApplySearchFilter() {