Appearance
Cangjie 1.1.3 Release Notes
版本介绍
Cangjie 1.1.3 为 STS 1.1 第二个发布版本,STS 1.1 维护周期6个月。
相比 1.1.0 版本,本版本无新增特性,有1个功能修复导致的变更,修复了若干问题;各模块修复问题详见本文档各章节介绍。
变更说明
| 场景描述 | 用例说明 | 变更前 | 变更后 | 适配方案 |
|---|---|---|---|---|
| 在父类和子类中,存在非override关系的2个函数,<br>在调用点经过实例化之后函数签名一致,<br>可能会出现运行结果错误的情况 | 见issue#820 | 使用O2编译,<br>运行时会打印"a",返回结果是1 | 使用O2编译,<br>运行时会打印"b", 返回结果是0 | issue#820 场景的代码需要根据新的返回值进行适配 |
编译器
修复问题
- issue#3118 优化宏展开生成错误注解调用时的报错信息。
- issue#783 修复
struct和class元数据缺少reflectVersion1标记导致运行时反射无法正确识别类型元数据的问题;reflectVersion1属性现同步写入 struct/class/box_class 的GenerateAttrsMetadata。 - issue#3116 修复管道运算符结合 trailing lambda 调用重载函数时,类型推断触发 ICE(SIGSEGV)的问题。受影响场景:
f |> { x => overloaded(x) }且无类型标注时必现崩溃,根因为TryEnforceCandidate中 PSet checkpoint 深度不一致。 - issue#2807 修复注解嵌套宏场景下宏展开失败的问题,覆盖两类场景:① 注解嵌套宏展开后生成子宏;② 宏展开结果本身包含注解嵌套宏。
- issue#794:修复 macOS 链接
libcangjie-std-ast.a时动态/静态混用导致AST相关接口出错的问题。 - issue#470:修复 Windows 场景
Driver调用posix_spawn失败时缺少错误消息的问题,修正FORMAT_MESSAGE_ALLOCATE_BUFFER内存分配及LocalFree释放逻辑。 - issue#465 修复读写
global struct成员时写/读屏障缺失,在aarch64上导致随机崩溃或数据竞争的问题。 - issue#820 修复虚函数去虚化时,泛型实例化后多个函数签名相同、过滤逻辑缺失导致选错目标方法、运行时调用到错误函数的问题。
- issue#879 修复内联优化后去虚化阶段
src class类型计算有误的问题:子类虚函数出现在多个父类虚表时,需通过偏移量比对选取正确父类,原实现过早断言唯一结果导致行为错误。 - issue#776 修复 VTable 生成中泛型参数类型映射错误的问题(issue #776),泛型继承场景下虚表条目类型不正确,改用
ReplaceRawGenericArgType进行泛型参数类型替换。 - issue#841 修复 override wrapper 返回
CPointer<T>时生成非法LLVM IR、触发verifier ICE的问题。 - issue#851:修复 Windows 下同时依赖
AST库并启用静态链接时libgcc_s链接方式无效的问题。
运行时
修复问题
- issue#513 修复涉及泛型实例类型多次接口查询的场景报错的问题。
- issue#592 修复
IntervalEndAsync偶发崩溃报错问题。 - issue#465 修复并发读取/修改
global struct偶发随机崩溃问题。 - issue#590 修复
SchdfdInit并发随机问题。
标准库
修复问题
- issue#621:修复了
std文档中代码块缩进不统一、冗余/缺少空格与空行、换行位置不恰当等代码风格问题。 - issue#579:修复了
stdC/C++ 编译链接告警等问题,包括无参数函数声明未加void、类型缺少const修饰、类型转换不规范、工具链编译标志缺失等。 - issue#603:修复了
std.time包时区ID校验过宽接受非法ID、TZif transition 时间未校验严格递增等边界行为问题;修复了std.unicode包Rune级与String级大小转换行为不一致问题。 - issue#577:修复了
std.net包CJ_RawAddressDestroy释放sockaddr后未清除指针导致保留悬空指针的问题。 - issue#574:修复了
std.regex包matchResult未初始化导致的问题。 - issue#578:修复了
std.unittest包文档中保留已不存在接口、函数缺少返回值类型声明、参数命名不规范等问题。 - issue#550:修复了
std.collection包HashSet遍历方法在删除元素后仍遍历无效条目(hash=-1)的问题。 - issue#571:修复了
std.math包Decimal Float32构造函数缺少scale溢出检查的问题。 - issue#569:修复了
std.net包抽象UDS路径缺少长度校验、超长路径未拒绝的问题。 - issue#567:修复了
std.net包Windows下addrinfo结构体ai_addrlen字段类型定义与实现不一致、getaddrinfo调用传入空hints等问题。 - issue#525:修复了
std.net包CJ_RawAddressCreate内存泄漏、IPv6解析溢出、DNS地址族过滤缺失、getSocketOptionInt32use-after-free、IPv4数组比较逻辑错误、RawSocket双重关闭竞态、IPv6 scopeId丢失、空域名未校验、isMulticast()索引错误等问题。 - issue#545:修复了
std.math包fmod()仅检查正无穷遗漏负无穷、域边界检查使用epsilon比较可被绕过、round()对NaN输入行为未定义等问题。 - issue#521:修复了
std.core包atexit单回调失败中断后续回调、memcpy_s返回值未检查、UTF-8支持5/6字节非法码点、Duration计算错误、Future无限递归、String多处溢出风险等问题。 - issue#527:修复了
std.core包Thread.stateuse-after-free、Thread.namesetter TOCTOU 竞态、mallocCString异常不安全、Array.splitAt长度计算错误、readFromConsole静默失败等问题。 - issue#541:修复了
std.binary包UInt8/Int8/Bool的endian读写方法缺少空缓冲区边界检查的问题。 - issue#548:修复了
std.process包/dev/null文件描述符泄漏、fork()后子进程调用非异步信号安全函数导致死锁等问题。 - issue#522:修复了
std.collection包HashMap弱哈希混合易被攻击、ConcurrentHashMap零哈希混合、TreeMapquickEquals可产生误判等问题。 - issue#530:修复了
std.fs包 TOCTOU 竞态条件、CopyLink缓冲区溢出、Path.join路径遍历、Windows文件I/O整数截断、临时文件创建竞态、目录遍历异常时handle未释放等问题。 - issue#524:修复了
std.sync包SyncCounter.dec()竞态可导致计数器变负、NotifyOnce.wait超时计算错误、ReadWriteLock写者饥饿、Timer ID溢出越界等问题。 - issue#547:修复了
std.interop包参数拼写错误、handle默认值无效可导致重复创建句柄泄漏等问题。 - issue#561:修复了
std.regex包PCRE2无匹配/递归限制导致ReDoS 攻击风险的问题。 - issue#559:修复了
std.unicode包CASE_RANGES表映射不完整、希腊语终结sigma处理不正确、土耳其语/阿塞拜疆语I-dot处理不完整、大小写映射整数溢出、Rune.fromUtf8和trim无限循环风险等问题。
工具链
IDE插件
修复问题
- issue#398 修复复杂中文路径场景下无法正常提供语言服务的问题。
cjpm
修复问题
- issue#465 修复开启流水并行特性后的增量编译问题。
cjdb
修复问题
cjfmt
修复问题
- issue#421 修复数据越界问题。
cjlint
修复问题
- issue#417 修复
system接口拼接命令字符串问题。
文档变更说明
开发指南
“类型转换”章节新增“类型模式与子类型转换”小节。