From 9cf9d2be8366a0b4193cfb31da911184b0db6898 Mon Sep 17 00:00:00 2001 From: ocornut Date: Wed, 17 Sep 2025 18:06:03 +0200 Subject: [PATCH] Debug Tools: ID Stack Tool: fixed a crash when using PushOverrideID(0) during a query. (#8937, #4631) --- docs/CHANGELOG.txt | 2 ++ imgui.cpp | 11 +++++++++++ imgui_internal.h | 1 + 3 files changed, 14 insertions(+) diff --git a/docs/CHANGELOG.txt b/docs/CHANGELOG.txt index b1575131c..48de7e881 100644 --- a/docs/CHANGELOG.txt +++ b/docs/CHANGELOG.txt @@ -103,6 +103,8 @@ Other Changes: is now skipped. (#8904, #4631) - Debug Tools: ID Stack Tool: added option to hex-encode non-ASCII characters in output path. (#8904, #4631) +- Debug Tools: ID Stack Tool: fixed a crash when using PushOverrideID(0) during + a query. (#8937, #4631) - Debug Tools: Fixed assertion failure when opening a combo box while using io.ConfigDebugBeginReturnValueOnce/ConfigDebugBeginReturnValueLoop. (#8931) [@harrymander] - Demo: tweaked ShowFontSelector() and ShowStyleSelector() to update selection diff --git a/imgui.cpp b/imgui.cpp index 94092c3e4..88ceb1f6c 100644 --- a/imgui.cpp +++ b/imgui.cpp @@ -17662,6 +17662,7 @@ void ImGui::UpdateDebugToolStackQueries() // Clear hook when id stack tool is not visible g.DebugHookIdInfoId = 0; + tool->QueryHookActive = false; if (g.FrameCount != tool->LastActiveFrame + 1) return; @@ -17687,11 +17688,15 @@ void ImGui::UpdateDebugToolStackQueries() // Update hook stack_level = tool->StackLevel; if (stack_level == -1) + { g.DebugHookIdInfoId = query_main_id; + tool->QueryHookActive = true; + } else if (stack_level >= 0 && stack_level < tool->Results.Size) { g.DebugHookIdInfoId = tool->Results[stack_level].ID; tool->Results[stack_level].QueryFrameCount++; + tool->QueryHookActive = true; } } @@ -17701,11 +17706,17 @@ void ImGui::DebugHookIdInfo(ImGuiID id, ImGuiDataType data_type, const void* dat ImGuiContext& g = *GImGui; ImGuiWindow* window = g.CurrentWindow; ImGuiIDStackTool* tool = &g.DebugIDStackTool; + if (tool->QueryHookActive == false) + { + IM_ASSERT(id == 0); + return; + } // Step 0: stack query // This assumes that the ID was computed with the current ID stack, which tends to be the case for our widget. if (tool->StackLevel == -1) { + IM_ASSERT(tool->Results.Size == 0); tool->StackLevel++; tool->Results.resize(window->IDStack.Size + 1, ImGuiStackLevelInfo()); for (int n = 0; n < window->IDStack.Size + 1; n++) diff --git a/imgui_internal.h b/imgui_internal.h index 32d04df4e..d2a3f4d8b 100644 --- a/imgui_internal.h +++ b/imgui_internal.h @@ -2128,6 +2128,7 @@ struct ImGuiIDStackTool int StackLevel; // -1: query stack and resize Results, >= 0: individual stack level ImGuiID QueryMainId; // ID to query details for ImVector Results; + bool QueryHookActive; // Used to disambiguate the case where DebugHookIdInfoId == 0 which is valid. bool OptHexEncodeNonAsciiChars; bool OptCopyToClipboardOnCtrlC; float CopyToClipboardLastTime;