Repository navigation
fix: explicit layout deletion to avoid dangling pointers - #872
Conversation
1. Root cause: hideAll() deleted only the top-level layout via delete mp_ScrollWidget->layout(), relying on Qt implicit cascading deletion for child layouts. This left six member pointers dangling between delete and reassignment, risking use-after-free if any code accesses them in between. 2. Fix: explicitly delete each of the six layout member pointers from innermost to outermost, set each to nullptr after deletion, replacing the single delete mp_ScrollWidget->layout() call. 3. Impact: only DriverScanWidget::hideAll() is affected. Behavior is unchanged for normal state switching; the fix eliminates the dangling pointer window and removes the implicit dependency on Qt cascading deletion. Influence: 1. Test repeated switching between scanning, scan-failed, and network-error states to verify no crash or memory growth 2. Verify UI layout renders correctly after multiple state switches 3. Confirm no regression in scanning progress display fix: 显式删除布局避免悬垂指针 1. 根因:hideAll() 仅通过 delete mp_ScrollWidget->layout() 删除 顶层布局,依赖 Qt 隐式级联删除子布局。六个成员指针在 delete 与重新赋值之间处于悬空状态,若期间被访问将触发 use-after-free。 2. 方案:从内到外依次显式 delete 六个布局成员指针并置 nullptr, 替换原来的 delete mp_ScrollWidget->layout()。 3. 影响:仅影响 DriverScanWidget::hideAll(),正常状态切换行为 不变,消除悬垂指针窗口并移除对 Qt 级联删除的隐式依赖。 Influence: 1. 测试扫描中、扫描失败、网络错误三态反复切换,验证无崩溃 或内存增长 2. 验证多次状态切换后 UI 布局正确渲染 3. 确认扫描进度显示无回归 PMS: BUG-DEF-T19-002
Reviewer's guide (collapsed on small PRs)Reviewer's GuideDriverScanWidget::hideAll() now explicitly deletes and nulls all six layout members from inner to outer instead of relying on Qt’s cascading deletion, preventing transient dangling pointers while preserving normal state-switching behavior. Sequence diagram for explicit layout replacement in hideAllsequenceDiagram
participant DriverScanWidget
participant LayoutMembers
participant QtLayouts
DriverScanWidget->>LayoutMembers: hideAll()
DriverScanWidget->>QtLayouts: delete mp_HLayoutPic
DriverScanWidget->>DriverScanWidget: mp_HLayoutPic = nullptr
DriverScanWidget->>QtLayouts: delete mp_HLayoutscLabel
DriverScanWidget->>DriverScanWidget: mp_HLayoutscLabel = nullptr
DriverScanWidget->>QtLayouts: delete mp_HLayoutscProgress
DriverScanWidget->>DriverScanWidget: mp_HLayoutscProgress = nullptr
DriverScanWidget->>QtLayouts: delete mp_HLayoutInfoLabel
DriverScanWidget->>DriverScanWidget: mp_HLayoutInfoLabel = nullptr
DriverScanWidget->>QtLayouts: delete mp_VLayout
DriverScanWidget->>DriverScanWidget: mp_VLayout = nullptr
DriverScanWidget->>QtLayouts: delete mp_HLayout
DriverScanWidget->>DriverScanWidget: mp_HLayout = nullptr
DriverScanWidget->>QtLayouts: new QHBoxLayout()
DriverScanWidget->>QtLayouts: new QHBoxLayout()
DriverScanWidget->>QtLayouts: new QHBoxLayout()
File-Level Changes
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
deepin pr auto review🤖 AI 代码审查报告📊 总体评价
🔍 详细分析1. 语法逻辑 ✅评价: 语法正确,逻辑清晰 ✅ 通过 潜在问题: 建议: 无 2. 代码质量 ✅评价: 代码结构清晰,注释完整 ✅ 通过 潜在问题: 建议: 可考虑封装一个工具函数(如 deleteAndNull(Layout*& ptr))来减少重复代码,但对于仅 6 处的场景,当前写法可接受。 3. 代码性能 ✅评价: 性能良好,资源使用合理 ✅ 通过 潜在问题: 建议: 无 4. 代码安全 🔒评价: 存在0个安全漏洞 ✅ 通过
安全漏洞详情: 建议: 无 💡 改进建议代码示例// 当前代码已为正确的修复方式,无需额外修改。
// 如需进一步优化可考虑封装工具函数:
template<typename T>
void safeDelete(T*& ptr) {
delete ptr;
ptr = nullptr;
}
// 使用:safeDelete(mp_HLayoutPic);本报告由 AI 代码审查工具自动生成 |
|
[APPROVALNOTIFIER] This PR is NOT APPROVED This pull-request has been approved by: add-uos, lzwind The full list of commands accepted by this bot can be found here. DetailsNeeds approval from an approver in each of these files:Approvers can indicate their approval by writing |
|
/forcemerge |
fix: explicit layout deletion to avoid dangling pointers
delete mp_ScrollWidget->layout(), relying on Qt implicit
cascading deletion for child layouts. This left six member
pointers dangling between delete and reassignment, risking
use-after-free if any code accesses them in between.
from innermost to outermost, set each to nullptr after deletion,
replacing the single delete mp_ScrollWidget->layout() call.
is unchanged for normal state switching; the fix eliminates
the dangling pointer window and removes the implicit dependency
on Qt cascading deletion.
Influence:
network-error states to verify no crash or memory growth
fix: 显式删除布局避免悬垂指针
顶层布局,依赖 Qt 隐式级联删除子布局。六个成员指针在
delete 与重新赋值之间处于悬空状态,若期间被访问将触发
use-after-free。
替换原来的 delete mp_ScrollWidget->layout()。
不变,消除悬垂指针窗口并移除对 Qt 级联删除的隐式依赖。
Influence:
或内存增长
PMS: BUG-DEF-T19-002
Summary by Sourcery
Eliminate dangling layout pointers in DriverScanWidget::hideAll by explicitly resetting layouts before recreating the UI.
Bug Fixes:
Enhancements: