Skip to content

fix(partition): add tolerance to add button enable condition#210

Merged
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
GongHeng2017:202607142011-master-fix
Jul 14, 2026
Merged

fix(partition): add tolerance to add button enable condition#210
deepin-bot[bot] merged 1 commit into
linuxdeepin:masterfrom
GongHeng2017:202607142011-master-fix

Conversation

@GongHeng2017

Copy link
Copy Markdown
Contributor

Add floating-point tolerance when comparing input value with remaining space to prevent disabling the add button due to precision error.

比较输入值与剩余空间时增加浮点容差,避免因精度误差错误禁用添加按钮。

Log: 修复添加按钮在边界值被错误禁用
PMS: BUG-364667
Influence: 修复后用户输入等于剩余空间时添加按钮可正常启用,提升分区创建交互体验。

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sorry @GongHeng2017, you have reached your weekly rate limit of 500000 diff characters.

Please try again later or upgrade to continue using Sourcery

Add floating-point tolerance when comparing input value with remaining
space to prevent disabling the add button due to precision error.

比较输入值与剩余空间时增加浮点容差,避免因精度误差错误禁用添加按钮。

Log: 修复添加按钮在边界值被错误禁用
PMS: BUG-364667
Influence: 修复后用户输入等于剩余空间时添加按钮可正常启用,提升分区创建交互体验。
@GongHeng2017
GongHeng2017 force-pushed the 202607142011-master-fix branch from dbecd46 to 03a5097 Compare July 14, 2026 12:31
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

★ 总体评分:92分

■ 【总体评价】

代码修复了浮点数精度导致分区按钮误禁用的问题,引入epsilon容差方案正确且简洁
逻辑修复准确,代码质量良好,无安全漏洞,但因未解决同函数内预存的除零风险及缺少epsilon选值注释扣8分

■ 【详细分析】

  • 1.语法逻辑(基本正确)✓

PartitionWidget::onSetSliderValue()(第932-937行)中,修复将 value > (m_total - sumValue() / 1024) 改为 value > (m_total - sumValue() / 1024) + kFloatCompareEpsilon,正确解决了浮点精度导致恰好等于剩余空间时按钮被误禁用的问题。constexpr double kFloatCompareEpsilon = 0.01(第16行)定义合法,epsilon加在右侧使得容差范围内不再判定为超出,逻辑正确。
潜在问题:第932行 m_slider->setValue(static_cast<int>((value / (m_total - (sumValue() / 1024))) * 100)) 存在预存除零风险——当所有空间已分配时 m_total - sumValue() / 1024 为0,浮点除零产生infinity,static_cast<int>(infinity) 为未定义行为,可能导致崩溃;value == 0.00 仍使用直接浮点等值比较,虽然0.0可精确表示但风格不一致
建议:在滑块赋值前增加剩余空间非零检查,避免除零;将 value == 0.00 改为 value <= kFloatCompareEpsilon 以保持浮点比较风格一致

  • 2.代码质量(良好)✓

常量命名 kFloatCompareEpsilon 符合Google C++命名规范,使用 constexpr 保证编译期求值,修复改动最小化且意图清晰。版权年份更新合理。
潜在问题:缺少对epsilon值0.01选值依据的注释说明;sumValue() 在同一函数内被调用3次(第932行2次、第935行1次),存在重复调用
建议:添加注释说明0.01的选值理由(如"分区大小单位为GB,0.01GB≈10MB容差可覆盖浮点累积误差");考虑将 m_total - sumValue() / 1024 缓存为局部变量 remainingSpace,既消除重复调用又提高可读性

  • 3.代码性能(无性能问题)✓

新增的epsilon加法为O(1)常数操作,对性能无影响。constexpr 常量在编译期确定,无运行时开销。
潜在问题:sumValue()(第481行)在同一函数中被多次调用,若该函数内部遍历分区列表则存在重复计算开销,但此为预存问题非本次引入
建议:将剩余空间计算结果缓存为局部变量复用

  • 4.代码安全(存在0个安全漏洞)✓

漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个
本次diff仅修改浮点比较逻辑和新增常量定义,未引入任何外部输入处理、内存操作或权限相关变更,不存在安全风险。第932行的除零风险属于预存代码问题且为本地UI逻辑,不构成可远程利用的安全漏洞。

  • 建议:无需针对安全进行额外修复

■ 【改进建议代码示例】

// 第16行:添加epsilon选值注释
constexpr double kFloatCompareEpsilon = 0.01; // 分区大小单位为GB,0.01GB容差覆盖浮点累积误差

// 第932-937行:修复后的onSetSliderValue关键逻辑
void PartitionWidget::onSetSliderValue()
{
    // ...
    m_block = 1;
    
    // 缓存剩余空间,避免重复调用sumValue()并防止除零
    const double remainingSpace = m_total - (sumValue() / 1024);
    
    // 防止除零:剩余空间为0或负值时滑块置0
    if (remainingSpace > kFloatCompareEpsilon) {
        m_slider->setValue(static_cast<int>((value / remainingSpace) * 100));
    } else {
        m_slider->setValue(0);
    }
    
    m_currentEditSize = QString::number(value * 1024, 'f', 4);
    
    // 统一使用epsilon进行浮点比较
    if (value <= kFloatCompareEpsilon || value > remainingSpace + kFloatCompareEpsilon) {
        qDebug() << "Value is 0 or exceeds remaining space, disabling addButton";
        m_addButton->setEnabled(false);
    } else {
        // ...
    }
}

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: GongHeng2017, lzwind

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@GongHeng2017

Copy link
Copy Markdown
Contributor Author

/forcemerge

@deepin-bot

deepin-bot Bot commented Jul 14, 2026

Copy link
Copy Markdown
Contributor

This pr force merged! (status: unstable)

@deepin-bot
deepin-bot Bot merged commit 126fc50 into linuxdeepin:master Jul 14, 2026
22 of 23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants