已开启
fd_test_1 #20358
已开启
xhz-sz创建于 5 天前
xhz-sz
xhz-sz
5 天前

IssueNo: https://gitcode.com/openharmony/ability_ability_base/issues/1228

Description:

稳定性自检:

自检项 自检结果
涉及跨进程调用的相关操作需要抛至主线程或加锁防止并发
成员变量进行赋值或创建需要排查并发
谨慎在lambda表达式中使用引用捕获
谨慎在未经拷贝的情况下使用外部传入的string、C字符串
map\vector\list\set等stl模板类使用时需要排查并发
谨慎考虑加锁范围
在IPC通信中谨慎使用同步通信方式
禁止传递this指针至其他模块或线程(特别是eventhandler任务)
禁止将外部传入的裸指针在内部直接构造智能指针
禁止多个独立创建的智能指针管理同一地址
禁止在析构函数中抛异步任务
禁止js对象在非js线程(例如在IPC线程)创建、使用或销毁
禁止在对外接口中未经判空直接使用外部传入的指针
禁止接口返回局部变量引用
禁止在信号函数中加锁
禁止在关键流程(SA启动、应用启动等主流程)执行耗时的操作
禁止将同一个cpp编译在不同的so中

安全编码自检:

自检项 自检结果
裸指针避免通过隐式转换构造为sptr
json对象在取值之前必须先判断类型,避免类型不匹配
序列化时必须对传入的数组大小进行校验,避免出现超大数组
避免使用未明确位宽的整型,选择使用int8_t、uint8_t等类型
外部传入的路径要做规范化校验,对路径中的.、..、../等特殊字符严格校验
指针变量、表示资源描述符的变量、bool变量必须赋初值
readParcelable获取的对象使用前需要判空
分配和释放内存的函数需要成对出现
申请内存后异常退出前需要及时进行内存释放
内存申请前必须对内存大小进行合法性校验
内存分配后必须判断是否成功
禁止使用realloc、alloca函数
禁止打印文件路径、口令等敏感信息,如有需要,使用private修饰
禁止打印内存地址
整数之间运算时必须严格检查,确保不会出现溢出、反转、除0
禁止对有符号整数进行位操作符运算
禁止对指针进行逻辑或位运算
循环次数如果收外部数据控制,需要检验其合法性
禁止使用内存操作类危险函数,需要使用安全函数
谨慎使用不可重入函数
必须检查安全函数的返回值,并进行正确处理
禁止仅通过TokenType类型判断绕过权限校验

TDD Result:

XTS Result:

是否已执行L0用例

AI检视评分(使用本地代码检视skills扫描):

likedislike
合并受阻
afwk_helper成员
5 天前 评论:

开始进行AI检视!

AI review has been started, please wait...

likedislike
afwk_helper成员
5 天前 评论:
check type result report
start ai_review pass -
likedislike
xhz-szxhz-sz
5 天前 修改了pull request 的描述
openharmony_ciopenharmony_ci成员
5 天前 添加了label:waiting_on_author
openharmony_ci
openharmony_ci成员
5 天前 评论:

感谢提交 Pull Requests!如果您提交的PR已经开发完毕,请评论 "start build" 触发门禁,更多交互操作,请访问OpenHarmony社区支持命令清单。如果需要调整订阅PR、Issue的变更状态,请访问订阅链接


Thanks for submitting the pull request. If your Pull Request has already been developed, you can leave a "start build" comment to trigger the gated system. For more commands, please visit OpenHarmony Command List. If you need to change the subscription of a Pull Request or Issue, please visit the link.

likedislike
openharmony_ciopenharmony_ci成员
5 天前 添加了label:dco检查成功
afwk_helper成员
5 天前 评论:

⚠️ 🤖 AI 代码检视报告 ⚠️

总体评估: NEEDS_ATTENTION

问题统计:

  • 总问题数: 3
  • 严重问题: 0
  • 高危问题: 2

摘要:
本次PR通过引入WantFdScope和AssignDup重构了Want中文件描述符的所有权管理,有效防止了Fd泄漏,但对AssignDup失败的错误处理不够完善,可能导致Fd静默丢失和业务异常。

📊 详细报告
查看完整的审查详情,包括具体的问题描述、建议和代码位置:
🔗 查看详细报告


此评论由 OpenHarmony Insight 代码审查系统自动生成

likedislike
afwk_helper成员5 天前进行代码检视1
services/abilitymgr/src/ability_record.cpp
@@ -2115,3 +2115,3 @@
21152115 want_.CloseAllFd();
21162116 
2117- want_ = want;
2117+ if (!want_.AssignDup(want)) {
afwk_helper5 天前评论:

🤖 AI 代码检视意见(回复本评论可解决检视意见,点击被检视代码行左侧的小头像可收起检视意见)


🟠 AssignDup失败仅打印日志而未中断逻辑,可能导致Fd静默丢失

位置: L2117-L2119 | 严重程度: High

❓ 问题描述

在重构Fd所有权时,将原本的浅拷贝(want_ = want)替换为深拷贝(AssignDup)。然而,如果AssignDup因系统资源限制(如进程Fd达到上限导致dup失败)而返回失败,代码仅打印日志。此时want_中的Fd被剥离(stripped),后续依赖Fd的业务逻辑将发生静默失败,且原来want中的Fd也可能在其他地方被关闭,导致彻底丢失。

💡 修复建议

修改建议:当AssignDup失败时,应视为严重错误,中断后续逻辑或返回错误码,避免基于残缺的want继续执行。

2117: if (!want_.AssignDup(want)) {
2118: TAG_LOGE(AAFwkTag::ABILITYMGR, "AssignDup want_ failed, fd stripped");
2119: return; // 视具体逻辑返回错误或抛出异常
2120: }


likedislike
afwk_helper成员5 天前进行代码检视1
services/abilitymgr/src/scene_board/ui_ability_lifecycle_manager.cpp
@@ -2006,3 +2009,3 @@
20062009 sessionInfo->requestId = requestId;
20072010 sessionInfo->callerToken = abilityRequest.callerToken;
2008- sessionInfo->want = abilityRequest.want;
2011+ sessionInfo->want.CloseAllFd();
afwk_helper5 天前评论:

🤖 AI 代码检视意见(回复本评论可解决检视意见,点击被检视代码行左侧的小头像可收起检视意见)


🟠 AssignDup失败后继续执行,且配合CloseAllFd可能导致Fd双重丢失

位置: L2011-L2014 | 严重程度: High

❓ 问题描述

在CreateSessionInfo等函数中,先调用了CloseAllFd()关闭了sessionInfo->want原有的Fd,随后调用AssignDup进行深拷贝。如果AssignDup失败,不仅原有Fd被关闭,新Fd也未能复制成功(stripped)。这会导致sessionInfo持有一个没有有效Fd的Want,后续依赖该Want中Fd的逻辑将静默失败,未做任何错误处理或向上抛出异常。

💡 修复建议

修改建议:当AssignDup失败时应中断当前操作并返回错误,不应继续构建带有缺陷的SessionInfo。

2011: sessionInfo->want.CloseAllFd();
2012: if (!sessionInfo->want.AssignDup(abilityRequest.want)) {
2013: TAG_LOGE(AAFwkTag::ABILITYMGR, "AssignDup session want failed");
2014: return nullptr; // 或适当处理错误
2015: }


likedislike
afwk_helper成员5 天前进行代码检视1
services/abilitymgr/src/ability_manager_stub.cpp
@@ -4354,30 +4387,30 @@
43544387 }
4388+ WantFdScope fdScope(*want);
43554389 SanitizeWantParams(*want);
43564390 bool result = IsAbilityControllerStart(*want);
43574391 reply.WriteBool(result);
@@ -4407,6 +4441,7 @@ int32_t AbilityManagerStub::ExecuteIntentForDistributedInner(MessageParcel &data
44074441 TAG_LOGE(AAFwkTag::ABILITYMGR, "want null");
44084442 return ERR_INVALID_VALUE;
44094443 }
4444+ WantFdScope fdScope(*want);
44104445 
44114446 std::string srcDeviceId = data.ReadString();
44124447 if (srcDeviceId.empty()) {
@@ -4464,6 +4499,7 @@ int AbilityManagerStub::StartAbilityForResultAsCallerInner(MessageParcel &data,
44644499 TAG_LOGE(AAFwkTag::ABILITYMGR, "want null");
44654500 return ERR_INVALID_VALUE;
44664501 }
4502+ WantFdScope fdScope(*want);
44674503 SanitizeWantParams(*want);
44684504 sptr<IRemoteObject> callerToken = nullptr;
44694505 if (data.ReadBool()) {
@@ -4485,6 +4521,7 @@ int32_t AbilityManagerStub::StartUIAbilitiesInSplitWindowModeInner(MessageParcel
44854521 TAG_LOGE(AAFwkTag::ABILITYMGR, "want null");
44864522 return ERR_INVALID_VALUE;
44874523 }
4524+ WantFdScope fdScope(*want);
44884525 SanitizeWantParams(*want);
44894526 sptr<IRemoteObject> callerToken = data.ReadRemoteObject();
44904527 if (callerToken == nullptr) {
@@ -4512,6 +4549,7 @@ int32_t AbilityManagerStub::StartUIAbilitiesInner(MessageParcel &data, MessagePa
45124549 TAG_LOGE(AAFwkTag::ABILITYMGR, "null want");
afwk_helper5 天前评论:

🤖 AI 代码检视意见(回复本评论可解决检视意见,点击被检视代码行左侧的小头像可收起检视意见)


🟡 WantFdScope与wantList的浅拷贝并存可能导致Fd被意外关闭

位置: L4549-L4551 | 严重程度: Medium

❓ 问题描述

在StartUIAbilitiesInner的循环中,通过WantFdScope fdScope(*want)接管了当前want的Fd关闭职责。同时通过wantList.emplace_back(*want)将want存入列表。如果Want的拷贝构造是浅拷贝(未对Fd进行dup),当循环结束临时want被销毁时,WantFdScope会调用CloseAllFd(),这会导致wantList中所有Want持有的Fd被提前关闭,后续使用该列表的StartUIAbilities将获取到无效的Fd。

💡 修复建议

修改建议:确认wantList是否需要保留Fd。如果需要,应对want进行深拷贝(如调用AssignDup)后再加入列表,以避免在循环结束时Fd被WantFdScope提前关闭。

4549: WantFdScope fdScope(*want);
4550: SanitizeWantParams(*want);
4551: wantList.emplace_back();
4552: wantList.back().AssignDup(*want);


likedislike