From 0d5ff91cba2a5a79f20cc556394a235641f939b0 Mon Sep 17 00:00:00 2001 From: zhangziyao Date: Wed, 17 Dec 2025 10:33:39 +0800 Subject: [PATCH 1/2] [borrowck][bugfix] fixed the coredump when reborrowing a string literal --- clang/lib/Sema/BSC/SemaDeclBSC.cpp | 17 +++++++++++++---- .../reborrow_string_literals.cbs | 16 ++++++++++++++++ 2 files changed, 29 insertions(+), 4 deletions(-) create mode 100644 clang/test/BSC/Positive/Ownership/borrow_check_rules/reborrow_string_literals/reborrow_string_literals.cbs diff --git a/clang/lib/Sema/BSC/SemaDeclBSC.cpp b/clang/lib/Sema/BSC/SemaDeclBSC.cpp index d4e3711e6b1b..cba5d94f3948 100644 --- a/clang/lib/Sema/BSC/SemaDeclBSC.cpp +++ b/clang/lib/Sema/BSC/SemaDeclBSC.cpp @@ -676,6 +676,17 @@ public: FPOptionsOverride()); replacedNodesMap.Insert(E, BO); } + } else if (UO->getOpcode() >= UO_AddrMut && UO->getOpcode() <= UO_AddrConstDeref) { + if (isa(E->IgnoreParenImpCasts())) { + Expr *BaseE = E; + DeclRefExpr *DRE = ReplaceWithTemporaryVariable(E); + CastKind Kind = + DRE->getType()->getAsCXXRecordDecl() ? CK_NoOp : CK_LValueToRValue; + E = ImplicitCastExpr::Create(getSema().Context, DRE->getType(), Kind, + DRE, nullptr, VK_PRValue, + FPOptionsOverride()); + replacedNodesMap.Insert(E, BaseE); + } } UO->setSubExpr(E); return UO; @@ -946,10 +957,8 @@ public: ExprResult TransformUnaryOperator(UnaryOperator *UO) { Expr *Sub = UO->getSubExpr(); - if (UO->getOpcode() == UO_Deref) { - if (replacedNodesMap.Contains(Sub)) { - Sub = replacedNodesMap.Get(Sub); - } + if (replacedNodesMap.Contains(Sub)) { + Sub = replacedNodesMap.Get(Sub); } ExprResult Res = getDerived().TransformExpr(Sub); UO->setSubExpr(Res.get()); diff --git a/clang/test/BSC/Positive/Ownership/borrow_check_rules/reborrow_string_literals/reborrow_string_literals.cbs b/clang/test/BSC/Positive/Ownership/borrow_check_rules/reborrow_string_literals/reborrow_string_literals.cbs new file mode 100644 index 000000000000..7c43bab43d79 --- /dev/null +++ b/clang/test/BSC/Positive/Ownership/borrow_check_rules/reborrow_string_literals/reborrow_string_literals.cbs @@ -0,0 +1,16 @@ +// RUN: %clang %s -o %test.output +// RUN: %test.output +// RUN: %clang -rewrite-bsc %s -o %t-rw.c +// RUN: %clang %t-rw.c -o %t-rw.output +// RUN: %t-rw.output +// expected-no-diagnostics + +void bsc_strcpy_s(char* borrow strDest, int destMax, const char* borrow strSrc) { + *strDest = *strSrc; +} + +int main(){ + char db[10] = {0}; + bsc_strcpy_s(&mut *db, 5, &const *"DB1"); + return 0; +} -- Gitee From 26fcd2642da0e7f9bebe38b1f3df51c6915639c2 Mon Sep 17 00:00:00 2001 From: zhangziyao Date: Wed, 17 Dec 2025 11:48:16 +0800 Subject: [PATCH 2/2] [user manual] fixed the inccorect rrule description of conversion from T *borrow to void *borrow --- clang/docs/BSC/BiShengCLanguageUserManual.md | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/clang/docs/BSC/BiShengCLanguageUserManual.md b/clang/docs/BSC/BiShengCLanguageUserManual.md index 189f2e18a1d9..5f0bc1e476db 100644 --- a/clang/docs/BSC/BiShengCLanguageUserManual.md +++ b/clang/docs/BSC/BiShengCLanguageUserManual.md @@ -4149,14 +4149,16 @@ int main() { return 0; } ``` -2. 允许指向类型 T 的借用转换为指向 void 类型的借用,反过来从类型 void 的借用往类型 T 借用的转换,是不允许的。 +2. 允许指向类型 T 的借用隐式转换为指向 void 类型的借用,反过来从类型 void 的借用往类型 T 借用的隐式转换,是不允许的,但强制类型转换是允许的。 ```C void test() { int x = 10; int *borrow r = &mut x; void *borrow p = r; - // error: 不允许转为 void *borrow 类型 - int *borrow t = (int *borrow)p; + // error: 不允许隐式转为 void *borrow 类型 + int *borrow t1 = p; + // ok:允许强制转换为 void *borrow 类型 + int *borrow t2 = (int *borrow)p; } int main() { -- Gitee