Description

A crash can occur when a member of a UStruct has a category with the "|" symbol and is trying to be displayed inside by the FDetailLayoutBuilderImpl class.

This happens when there is a UStruct member that has a subcategory. Example: UPROPERTY(Category="ParentCat|ChildCategory")

When these types of properties are displayed in a DetailsView, if any member is tickable, a FDetailTreeNode* member is created. For some reason, this tickable members can turn invalid, and this only happens in members that are inside subcategories. The data structure that manages this behavior is FDetailLayoutBuilderImpl::TickableNodes. The crash occurs inside FDetailLayoutBuilderImpl::Tick, as some nodes inside TickableNodes turn invalid.

Steps to Reproduce

With repro project:

1. Open the Repro project
2. Run the EditorUtilityWidget called EUMG_EditTestObject

Without Repro Project:

1- Create the mentioned UStruct with subcategories.
2- Display it inside a UPropertyViewBase object or a derived one like UDetailsView.

Callstack

PureCallHandler() WindowsPlatformMisc.cpp:732
FDetailLayoutBuilderImpl::Tick(float) DetailLayoutBuilderImpl.cpp:1064
SDetailsViewBase::Tick(const FGeometry &, const double, const float) SDetailsViewBase.cpp:1318
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1445
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SBorder::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SBorder.cpp:131
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SObjectWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SObjectWidget.cpp:140
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SBorder::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SBorder.cpp:131
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SOverlay::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SOverlay.cpp:209
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SSplitter::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SSplitter.cpp:250
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SSplitter::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SSplitter.cpp:250
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SSplitter::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SSplitter.cpp:250
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SOverlay::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SOverlay.cpp:209
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SOverlay::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SOverlay.cpp:209
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SBorder::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SBorder.cpp:131
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SOverlay::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SOverlay.cpp:209
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SSplitter::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SSplitter.cpp:250
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SOverlay::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SOverlay.cpp:209
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SOverlay::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SOverlay.cpp:209
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SPanel::PaintArrangedChildren(const FPaintArgs &, const FArrangedChildren &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:33
SPanel::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SPanel.cpp:15
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SOverlay::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SOverlay.cpp:209
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SCompoundWidget::OnPaint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SCompoundWidget.cpp:46
SWidget::Paint(const FPaintArgs &, const FGeometry &, const FSlateRect &, FSlateWindowElementList &, int, const FWidgetStyle &, bool) SWidget.cpp:1579
SWindow::PaintSlowPath(const FSlateInvalidationContext &) SWindow.cpp:2081
FSlateInvalidationRoot::PaintInvalidationRoot(const FSlateInvalidationContext &) SlateInvalidationRoot.cpp:411
SWindow::PaintWindow(double, float, FSlateWindowElementList &, const FWidgetStyle &, bool) SWindow.cpp:2120
FSlateApplication::DrawWindowAndChildren(const TSharedRef<…> &, FDrawWindowArgs &) SlateApplication.cpp:1177
FSlateApplication::PrivateDrawWindows(TSharedPtr<…>) SlateApplication.cpp:1419
FSlateApplication::DrawWindows() SlateApplication.cpp:1121
FSlateApplication::TickAndDrawWidgets(float) SlateApplication.cpp:1721
FSlateApplication::Tick(ESlateTickType) SlateApplication.cpp:1574
FEngineLoop::Tick() LaunchEngineLoop.cpp:5994
[Inlined] EngineTick() Launch.cpp:69
GuardedMain(const wchar_t *) Launch.cpp:190
LaunchWindowsStartup(HINSTANCE__ *, HINSTANCE__ *, char *, int, const wchar_t *) LaunchWindows.cpp:266
WinMain(HINSTANCE__ *, HINSTANCE__ *, char *, int) LaunchWindows.cpp:317

Have Comments or More Details?

There's no existing public thread on this issue, so head over to Questions & Answers just mention UE-232029 in the post.

0
Login to Vote

Unresolved
ComponentUE - Editor - Workflow Systems
Affects Versions5.45.35.5
CreatedDec 3, 2024
UpdatedDec 5, 2024
View Jira Issue