OpenSCAD输入某些字符导致应用闪退问题分析定位(QScintilla)

前置条件

  • macOS Sequoia (15.2) 
  • MacBook Pro 2023-Apple M2 Pro (4能效核、8性能核、32GB内存、2TB磁盘)
  • OpenSCAD 2024.12.13 (或更高版本)
  • QScintilla 2.14.1
  • Xcode 16.2

问题现象

输入法切换到 “简体拼音”, 然后按下自带键盘上的 左侧 Shift- 按键,目的是按出下划线,会导致 OpenSCAD 闪退:

问题复现

1. 打开 OpenSCAD,然后输入法选择 “简体拼音”:

2. 同时按下下图红色框中的左侧 Shift- 按键:

问题定位

1. 下载编译 OpenSCAD 源代码:

2. 下载编译 QScintilla 2.14.1 源代码:

3. 替换 HomeBrew 安装目录下的非调试版本:

4. 启动 Xcode 选择 "Debug" -> "Attach to Process"。

问题解析

调试可以看到问题出在下图位置:

调用堆栈 异常触发位置
调用堆栈 异常触发位置
出问题的调用堆栈,给出的字符缓冲区
出问题的调用堆栈,给出的字符缓冲区
调用堆栈 keyPressEvent
调用堆栈 keyPressEvent
调用堆栈 异常捕获位置
调用堆栈 异常捕获位置

从上面的调用堆栈可以看到 macOS 的一次按键点击事件,给出了 2UTF-8 字符 “——”,每个字符长度为 3 。而QTQScintilla 库预期只会出现一个字符,导致给出的缓冲区不足,诱发异常抛出。

只是奇怪的是 OpenSCAD 的代码明明已经进行了相关的异常捕获,但是却毫无效果。

调用堆栈 异常捕获位置
调用堆栈 异常捕获无效

具体出问题的原因如下图:

假定字符的数量总是 1 导致当传入的字符数量为2 的时候出现异常
假定字符的数量总是 1 导致当传入的字符数量为2 的时候出现异常

具体代码片段如下:

后续进展

当前(2025.01.08)已经发送邮件给项目的开发老师,等待后续回复。

临时修改的话,可以参考如下进行调整:

参考链接


发布者

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注