mirror of https://github.com/ocornut/imgui
Fix various XCode and PVS-Studio static analyzer warnings (#2309)
This commit is contained in:
parent
20bc06af70
commit
c3c2cd1e82
25
imgui.cpp
25
imgui.cpp
|
@ -4039,7 +4039,8 @@ int ImGui::CalcTypematicPressedRepeatAmount(float t, float t_prev, float repeat_
|
||||||
int ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_rate)
|
int ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_rate)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (key_index < 0) return false;
|
if (key_index < 0)
|
||||||
|
return 0;
|
||||||
IM_ASSERT(key_index >= 0 && key_index < IM_ARRAYSIZE(g.IO.KeysDown));
|
IM_ASSERT(key_index >= 0 && key_index < IM_ARRAYSIZE(g.IO.KeysDown));
|
||||||
const float t = g.IO.KeysDownDuration[key_index];
|
const float t = g.IO.KeysDownDuration[key_index];
|
||||||
return CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, repeat_delay, repeat_rate);
|
return CalcTypematicPressedRepeatAmount(t, t - g.IO.DeltaTime, repeat_delay, repeat_rate);
|
||||||
|
@ -4048,7 +4049,8 @@ int ImGui::GetKeyPressedAmount(int key_index, float repeat_delay, float repeat_r
|
||||||
bool ImGui::IsKeyPressed(int user_key_index, bool repeat)
|
bool ImGui::IsKeyPressed(int user_key_index, bool repeat)
|
||||||
{
|
{
|
||||||
ImGuiContext& g = *GImGui;
|
ImGuiContext& g = *GImGui;
|
||||||
if (user_key_index < 0) return false;
|
if (user_key_index < 0)
|
||||||
|
return false;
|
||||||
IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown));
|
IM_ASSERT(user_key_index >= 0 && user_key_index < IM_ARRAYSIZE(g.IO.KeysDown));
|
||||||
const float t = g.IO.KeysDownDuration[user_key_index];
|
const float t = g.IO.KeysDownDuration[user_key_index];
|
||||||
if (t == 0.0f)
|
if (t == 0.0f)
|
||||||
|
@ -4139,13 +4141,12 @@ ImVec2 ImGui::GetMousePosOnOpeningCurrentPopup()
|
||||||
return g.IO.MousePos;
|
return g.IO.MousePos;
|
||||||
}
|
}
|
||||||
|
|
||||||
// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position
|
// We typically use ImVec2(-FLT_MAX,-FLT_MAX) to denote an invalid mouse position.
|
||||||
bool ImGui::IsMousePosValid(const ImVec2* mouse_pos)
|
bool ImGui::IsMousePosValid(const ImVec2* mouse_pos)
|
||||||
{
|
{
|
||||||
if (mouse_pos == NULL)
|
|
||||||
mouse_pos = &GImGui->IO.MousePos;
|
|
||||||
const float MOUSE_INVALID = -256000.0f;
|
const float MOUSE_INVALID = -256000.0f;
|
||||||
return mouse_pos->x >= MOUSE_INVALID && mouse_pos->y >= MOUSE_INVALID;
|
ImVec2 p = mouse_pos ? *mouse_pos : GImGui->IO.MousePos;
|
||||||
|
return p.x >= MOUSE_INVALID && p.y >= MOUSE_INVALID;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the delta from the initial clicking position.
|
// Return the delta from the initial clicking position.
|
||||||
|
@ -4819,7 +4820,10 @@ void ImGui::UpdateWindowParentAndRootLinks(ImGuiWindow* window, ImGuiWindowFlags
|
||||||
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)))
|
if (parent_window && !(flags & ImGuiWindowFlags_Modal) && (flags & (ImGuiWindowFlags_ChildWindow | ImGuiWindowFlags_Popup)))
|
||||||
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
|
window->RootWindowForTitleBarHighlight = parent_window->RootWindowForTitleBarHighlight;
|
||||||
while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
|
while (window->RootWindowForNav->Flags & ImGuiWindowFlags_NavFlattened)
|
||||||
|
{
|
||||||
|
IM_ASSERT(window->RootWindowForNav->ParentWindow != NULL);
|
||||||
window->RootWindowForNav = window->RootWindowForNav->ParentWindow;
|
window->RootWindowForNav = window->RootWindowForNav->ParentWindow;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Push a new ImGui window to add widgets to.
|
// Push a new ImGui window to add widgets to.
|
||||||
|
@ -5082,7 +5086,7 @@ bool ImGui::Begin(const char* name, bool* p_open, ImGuiWindowFlags flags)
|
||||||
// Position child window
|
// Position child window
|
||||||
if (flags & ImGuiWindowFlags_ChildWindow)
|
if (flags & ImGuiWindowFlags_ChildWindow)
|
||||||
{
|
{
|
||||||
IM_ASSERT(parent_window->Active);
|
IM_ASSERT(parent_window && parent_window->Active);
|
||||||
window->BeginOrderWithinParent = (short)parent_window->DC.ChildWindows.Size;
|
window->BeginOrderWithinParent = (short)parent_window->DC.ChildWindows.Size;
|
||||||
parent_window->DC.ChildWindows.push_back(window);
|
parent_window->DC.ChildWindows.push_back(window);
|
||||||
if (!(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api && !window_is_child_tooltip)
|
if (!(flags & ImGuiWindowFlags_Popup) && !window_pos_set_by_api && !window_is_child_tooltip)
|
||||||
|
@ -9283,7 +9287,7 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
||||||
{
|
{
|
||||||
ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[vtx_i] : vtx_i];
|
ImDrawVert& v = draw_list->VtxBuffer[idx_buffer ? idx_buffer[vtx_i] : vtx_i];
|
||||||
triangles_pos[n] = v.pos;
|
triangles_pos[n] = v.pos;
|
||||||
buf_p += ImFormatString(buf_p, (int)(buf_end - buf_p), "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", (n == 0) ? "vtx" : " ", vtx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);
|
buf_p += ImFormatString(buf_p, buf_end - buf_p, "%s %04d: pos (%8.2f,%8.2f), uv (%.6f,%.6f), col %08X\n", (n == 0) ? "vtx" : " ", vtx_i, v.pos.x, v.pos.y, v.uv.x, v.uv.y, v.col);
|
||||||
}
|
}
|
||||||
ImGui::Selectable(buf, false);
|
ImGui::Selectable(buf, false);
|
||||||
if (ImGui::IsItemHovered())
|
if (ImGui::IsItemHovered())
|
||||||
|
@ -9352,12 +9356,11 @@ void ImGui::ShowMetricsWindow(bool* p_open)
|
||||||
|
|
||||||
static void NodeTabBar(ImGuiTabBar* tab_bar)
|
static void NodeTabBar(ImGuiTabBar* tab_bar)
|
||||||
{
|
{
|
||||||
// Standalone tab bars (not associated to docking/windows functionality) currently hold no discernable strings.
|
// Standalone tab bars (not associated to docking/windows functionality) currently hold no discernible strings.
|
||||||
char buf[256];
|
char buf[256];
|
||||||
char* p = buf;
|
char* p = buf;
|
||||||
const char* buf_end = buf + IM_ARRAYSIZE(buf);
|
const char* buf_end = buf + IM_ARRAYSIZE(buf);
|
||||||
p += ImFormatString(p, buf_end - p, "TabBar (%d tabs)%s",
|
ImFormatString(p, buf_end - p, "TabBar (%d tabs)%s", tab_bar->Tabs.Size, (tab_bar->PrevFrameVisible < ImGui::GetFrameCount() - 2) ? " *Inactive*" : "");
|
||||||
tab_bar->Tabs.Size, (tab_bar->PrevFrameVisible < ImGui::GetFrameCount() - 2) ? " *Inactive*" : "");
|
|
||||||
if (ImGui::TreeNode(tab_bar, "%s", buf))
|
if (ImGui::TreeNode(tab_bar, "%s", buf))
|
||||||
{
|
{
|
||||||
for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
|
for (int tab_n = 0; tab_n < tab_bar->Tabs.Size; tab_n++)
|
||||||
|
|
2
imgui.h
2
imgui.h
|
@ -1945,7 +1945,7 @@ struct ImFontGlyphRangesBuilder
|
||||||
{
|
{
|
||||||
ImVector<int> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used)
|
ImVector<int> UsedChars; // Store 1-bit per Unicode code point (0=unused, 1=used)
|
||||||
|
|
||||||
ImFontGlyphRangesBuilder() { UsedChars.resize(0x10000 / 32); memset(UsedChars.Data, 0, 0x10000 / 32); }
|
ImFontGlyphRangesBuilder() { UsedChars.resize(0x10000 / sizeof(int)); memset(UsedChars.Data, 0, 0x10000 / sizeof(int)); }
|
||||||
bool GetBit(int n) const { int off = (n >> 5); int mask = 1 << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array
|
bool GetBit(int n) const { int off = (n >> 5); int mask = 1 << (n & 31); return (UsedChars[off] & mask) != 0; } // Get bit n in the array
|
||||||
void SetBit(int n) { int off = (n >> 5); int mask = 1 << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array
|
void SetBit(int n) { int off = (n >> 5); int mask = 1 << (n & 31); UsedChars[off] |= mask; } // Set bit n in the array
|
||||||
void AddChar(ImWchar c) { SetBit(c); } // Add character
|
void AddChar(ImWchar c) { SetBit(c); } // Add character
|
||||||
|
|
|
@ -879,12 +879,13 @@ static void ShowDemoWindowWidgets()
|
||||||
ImGui::PushID(i);
|
ImGui::PushID(i);
|
||||||
if (ImGui::Selectable("Sailor", &selected[i], 0, ImVec2(50,50)))
|
if (ImGui::Selectable("Sailor", &selected[i], 0, ImVec2(50,50)))
|
||||||
{
|
{
|
||||||
|
// Note: We _unnecessarily_ test for both x/y and i here only to silence some static analyzer. The second part of each test is unnecessary.
|
||||||
int x = i % 4;
|
int x = i % 4;
|
||||||
int y = i / 4;
|
int y = i / 4;
|
||||||
if (x > 0) { selected[i - 1] ^= 1; }
|
if (x > 0 && i > 0) { selected[i - 1] ^= 1; }
|
||||||
if (x < 3) { selected[i + 1] ^= 1; }
|
if (x < 3 && i < 15) { selected[i + 1] ^= 1; }
|
||||||
if (y > 0) { selected[i - 4] ^= 1; }
|
if (y > 0 && i > 3) { selected[i - 4] ^= 1; }
|
||||||
if (y < 3) { selected[i + 4] ^= 1; }
|
if (y < 3 && i < 12) { selected[i + 4] ^= 1; }
|
||||||
}
|
}
|
||||||
if ((i % 4) < 3) ImGui::SameLine();
|
if ((i % 4) < 3) ImGui::SameLine();
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
|
@ -3093,7 +3094,7 @@ struct ExampleAppConsole
|
||||||
// Portable helpers
|
// Portable helpers
|
||||||
static int Stricmp(const char* str1, const char* str2) { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; }
|
static int Stricmp(const char* str1, const char* str2) { int d; while ((d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; } return d; }
|
||||||
static int Strnicmp(const char* str1, const char* str2, int n) { int d = 0; while (n > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; n--; } return d; }
|
static int Strnicmp(const char* str1, const char* str2, int n) { int d = 0; while (n > 0 && (d = toupper(*str2) - toupper(*str1)) == 0 && *str1) { str1++; str2++; n--; } return d; }
|
||||||
static char* Strdup(const char *str) { size_t len = strlen(str) + 1; void* buff = malloc(len); return (char*)memcpy(buff, (const void*)str, len); }
|
static char* Strdup(const char *str) { size_t len = strlen(str) + 1; void* buf = malloc(len); IM_ASSERT(buf); return (char*)memcpy(buf, (const void*)str, len); }
|
||||||
static void Strtrim(char* str) { char* str_end = str + strlen(str); while (str_end > str && str_end[-1] == ' ') str_end--; *str_end = 0; }
|
static void Strtrim(char* str) { char* str_end = str + strlen(str); while (str_end > str && str_end[-1] == ' ') str_end--; *str_end = 0; }
|
||||||
|
|
||||||
void ClearLog()
|
void ClearLog()
|
||||||
|
|
|
@ -2063,6 +2063,7 @@ void ImFontAtlasBuildSetupFont(ImFontAtlas* atlas, ImFont* font, ImFontConfig* f
|
||||||
void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque)
|
void ImFontAtlasBuildPackCustomRects(ImFontAtlas* atlas, void* stbrp_context_opaque)
|
||||||
{
|
{
|
||||||
stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque;
|
stbrp_context* pack_context = (stbrp_context*)stbrp_context_opaque;
|
||||||
|
IM_ASSERT(pack_context != NULL);
|
||||||
|
|
||||||
ImVector<ImFontAtlas::CustomRect>& user_rects = atlas->CustomRects;
|
ImVector<ImFontAtlas::CustomRect>& user_rects = atlas->CustomRects;
|
||||||
IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong.
|
IM_ASSERT(user_rects.Size >= 1); // We expect at least the default custom rects to be registered, else something went wrong.
|
||||||
|
|
|
@ -183,7 +183,7 @@ IMGUI_API int ImFormatString(char* buf, size_t buf_size, const char* f
|
||||||
IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
|
IMGUI_API int ImFormatStringV(char* buf, size_t buf_size, const char* fmt, va_list args) IM_FMTLIST(3);
|
||||||
IMGUI_API const char* ImParseFormatFindStart(const char* format);
|
IMGUI_API const char* ImParseFormatFindStart(const char* format);
|
||||||
IMGUI_API const char* ImParseFormatFindEnd(const char* format);
|
IMGUI_API const char* ImParseFormatFindEnd(const char* format);
|
||||||
IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, int buf_size);
|
IMGUI_API const char* ImParseFormatTrimDecorations(const char* format, char* buf, size_t buf_size);
|
||||||
IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
|
IMGUI_API int ImParseFormatPrecision(const char* format, int default_value);
|
||||||
|
|
||||||
// Helpers: ImVec2/ImVec4 operators
|
// Helpers: ImVec2/ImVec4 operators
|
||||||
|
|
|
@ -2577,7 +2577,7 @@ const char* ImParseFormatFindEnd(const char* fmt)
|
||||||
// fmt = "%.3f" -> return fmt
|
// fmt = "%.3f" -> return fmt
|
||||||
// fmt = "hello %.3f" -> return fmt + 6
|
// fmt = "hello %.3f" -> return fmt + 6
|
||||||
// fmt = "%.3f hello" -> return buf written with "%.3f"
|
// fmt = "%.3f hello" -> return buf written with "%.3f"
|
||||||
const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, int buf_size)
|
const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, size_t buf_size)
|
||||||
{
|
{
|
||||||
const char* fmt_start = ImParseFormatFindStart(fmt);
|
const char* fmt_start = ImParseFormatFindStart(fmt);
|
||||||
if (fmt_start[0] != '%')
|
if (fmt_start[0] != '%')
|
||||||
|
@ -2585,7 +2585,7 @@ const char* ImParseFormatTrimDecorations(const char* fmt, char* buf, int buf_siz
|
||||||
const char* fmt_end = ImParseFormatFindEnd(fmt_start);
|
const char* fmt_end = ImParseFormatFindEnd(fmt_start);
|
||||||
if (fmt_end[0] == 0) // If we only have leading decoration, we don't need to copy the data.
|
if (fmt_end[0] == 0) // If we only have leading decoration, we don't need to copy the data.
|
||||||
return fmt_start;
|
return fmt_start;
|
||||||
ImStrncpy(buf, fmt_start, ImMin((int)(fmt_end + 1 - fmt_start), buf_size));
|
ImStrncpy(buf, fmt_start, ImMin((size_t)(fmt_end - fmt_start) + 1, buf_size));
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6427,7 +6427,7 @@ bool ImGui::TabItemEx(ImGuiTabBar* tab_bar, const char* label, bool* p_open,
|
||||||
// Render tab label, process close button
|
// Render tab label, process close button
|
||||||
const ImGuiID close_button_id = p_open ? window->GetID((void*)((intptr_t)id + 1)) : 0;
|
const ImGuiID close_button_id = p_open ? window->GetID((void*)((intptr_t)id + 1)) : 0;
|
||||||
bool just_closed = TabItemLabelAndCloseButton(display_draw_list, bb, flags, label, id, close_button_id);
|
bool just_closed = TabItemLabelAndCloseButton(display_draw_list, bb, flags, label, id, close_button_id);
|
||||||
if (just_closed)
|
if (just_closed && p_open != NULL)
|
||||||
{
|
{
|
||||||
*p_open = false;
|
*p_open = false;
|
||||||
TabBarCloseTab(tab_bar, tab);
|
TabBarCloseTab(tab_bar, tab);
|
||||||
|
|
|
@ -563,7 +563,6 @@ static void stb_textedit_find_charpos(StbFindState *find, STB_TEXTEDIT_STRING *s
|
||||||
|
|
||||||
// now scan to find xpos
|
// now scan to find xpos
|
||||||
find->x = r.x0;
|
find->x = r.x0;
|
||||||
i = 0;
|
|
||||||
for (i=0; first+i < n; ++i)
|
for (i=0; first+i < n; ++i)
|
||||||
find->x += STB_TEXTEDIT_GETWIDTH(str, first, i);
|
find->x += STB_TEXTEDIT_GETWIDTH(str, first, i);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,6 @@
|
||||||
|
// [ImGui] this is a slightly modified version of stb_truetype.h 1.19. Those changes would need to be pushed into nothings/stb
|
||||||
|
// grep for [ImGui] to find the changes.
|
||||||
|
|
||||||
// stb_truetype.h - v1.19 - public domain
|
// stb_truetype.h - v1.19 - public domain
|
||||||
// authored from 2009-2016 by Sean Barrett / RAD Game Tools
|
// authored from 2009-2016 by Sean Barrett / RAD Game Tools
|
||||||
//
|
//
|
||||||
|
@ -2368,7 +2371,8 @@ static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph)
|
||||||
if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount)
|
if (glyph >= startGlyphID && glyph < startGlyphID + glyphCount)
|
||||||
return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID));
|
return (stbtt_int32)ttUSHORT(classDef1ValueArray + 2 * (glyph - startGlyphID));
|
||||||
|
|
||||||
classDefTable = classDef1ValueArray + 2 * glyphCount;
|
// [ImGui: commented to fix static analyzer warning]
|
||||||
|
//classDefTable = classDef1ValueArray + 2 * glyphCount;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case 2: {
|
case 2: {
|
||||||
|
@ -2392,7 +2396,8 @@ static stbtt_int32 stbtt__GetGlyphClass(stbtt_uint8 *classDefTable, int glyph)
|
||||||
return (stbtt_int32)ttUSHORT(classRangeRecord + 4);
|
return (stbtt_int32)ttUSHORT(classRangeRecord + 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
classDefTable = classRangeRecords + 6 * classRangeCount;
|
// [ImGui: commented to fix static analyzer warning]
|
||||||
|
//classDefTable = classRangeRecords + 6 * classRangeCount;
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
default: {
|
default: {
|
||||||
|
@ -3024,6 +3029,7 @@ static void stbtt__fill_active_edges_new(float *scanline, float *scanline_fill,
|
||||||
dx = -dx;
|
dx = -dx;
|
||||||
dy = -dy;
|
dy = -dy;
|
||||||
t = x0, x0 = xb, xb = t;
|
t = x0, x0 = xb, xb = t;
|
||||||
|
(void)dx; // [ImGui: fix static analyzer warning]
|
||||||
}
|
}
|
||||||
|
|
||||||
x1 = (int) x_top;
|
x1 = (int) x_top;
|
||||||
|
@ -4253,7 +4259,7 @@ static int stbtt__compute_crossings_x(float x, float y, int nverts, stbtt_vertex
|
||||||
int winding = 0;
|
int winding = 0;
|
||||||
|
|
||||||
orig[0] = x;
|
orig[0] = x;
|
||||||
orig[1] = y;
|
//orig[1] = y; // [ImGui] commmented double assignment without reading
|
||||||
|
|
||||||
// make sure y never passes through a vertex of the shape
|
// make sure y never passes through a vertex of the shape
|
||||||
y_frac = (float) STBTT_fmod(y, 1.0f);
|
y_frac = (float) STBTT_fmod(y, 1.0f);
|
||||||
|
|
Loading…
Reference in New Issue