Java 、Idea、Android Studio 用户请暂缓升级到 macOS 14.4

252 天前
 codehz
https://blogs.oracle.com/java/post/java-on-macos-14-4
省流:果子改了受保护页面的默认处理方式,之前是发 sigsegv 现在直接 sigkill ,而 java 从很早的版本(已知 8 )开始就在滥用这个特性来将 null 检测改为捕获 sigsegv 信号,包括用户主动写的 if == null 也会在 jit 的帮助下被转换,这在新版本 mac 里会直接触发错误。
建议有 java 需求或依赖基于 java 的 ide 的 mac 用户暂缓升级
13741 次点击
所在节点    Apple
109 条回复
codehz
252 天前
@lslqtz 我怀疑可能是有什么延迟上的差异导致泄露信息🤔
codehz
252 天前
@felixlong 目前据我所知只有 java 在广泛使用这个技巧,其他 jit 都没这么做
不过数组越界肯定不会用这个方法,总不能一个数组刚好吃一个 4k 页面(apple silicon 好像是 16k),然后上下两侧摆 guard page ,这也太奢侈了
至于空指针,支持 jit 的语言里有空指针暴露给用户的就挺少的了 js 肯定不是,go 和 net 据我所知也没人说有做类似优化
Evrins
252 天前
14.4 一发布就升级了
Goland RustRover DataGrip 都用的好好的
eailfly
252 天前
只影响 Apple silicon 版本,还在用 Intel 2019 的一下子就放心了
a66243766
252 天前
我就说我的 goland 最近一直崩溃
neiltroyer849
252 天前
似乎应该是与 Apple Silicon 自 A11 开始引入的 Fast Permission Restrictions 有关系。原来是在 iOS 上的,后来 Mac 上了 AS 因而 macOS 也支持了这种 per thread 的权限限制?
iseki
252 天前
这有点坑啊,这种重大变更怎么能无预警直接推呢,至少也应该保留一个逃生门。
iseki
252 天前
@rainbowmolly 触发段错误信号的行为是良定义+可保证的,如果能用来提升性能为啥不能用。你说的直接退出只是因为没有好好处理段错误信号吧。
iseki
252 天前
@codehz Go 写的程序可能也受影响,它的空指针访问也是可以在程序内部捕获的,而且好像也是通过段错误信号兜住的(只观察过 Linux/Windows 平台)
codehz
252 天前
@iseki 啊,写错了,是要有 jit ,还得刚好处于 write 的状态触发
jay2049
252 天前
感谢楼主提醒
coang
252 天前
优秀的系统,垃圾的 JDK,居然能影响这么多个版本 Java 怎么做的兼容性测试!!(狗头
ipcjs
252 天前
Windows 用的 beta 版都从来没问题,macOS 升一次一堆软件出问题,老早把那个傻 diao 自动升级关掉了💩
ShadowPower
252 天前
上星期已经被坑了,感觉 mac 做开发的体验真的不如 Windows 了……
Windows 的稳定版我都随意更新
codehz
252 天前
找到了一个问题复现的代码
#include <stdio.h>
#include <sys/mman.h>
#include <pthread.h>

int main() {
pthread_jit_write_protect_np(0);

char* mem = (char*)mmap(0, 16 * 1024, 0, MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0);
fprintf(stderr, "addr = %p\n", mem);

char value = *mem;
fprintf(stderr, "value = %c\n", value);

return 0;
}
,在之前版本里是 sigbus ,可以捕获,14.4 就直接 sigkill 了
原来这个 write 模式是指这玩意
stinkytofu
252 天前
MAC 现在确实不敢随意更新版本, 说不定什么刚需软件就工作不正常了, 很难受。
tt0411
252 天前
怪不得 clion 时不时 crash...
iseki
252 天前
@codehz 还行,看了下只要他们切换下保护就没事了

> We discovered that if we switch the jit protection mode to EXEC rather than WRITE, then these page faults again raise the expected SIGBUS not a SIGKILL. Note the faulting accesses are predominantly reads and have nothing at all to do with accessing a MAP_JIT memory region.
> We have been working on a patch that switches the jit protection mode to EXEC around these potential faulting memory accesses. It has been a bit of an exercise in whack-a-mole finding them all, and testing is still in progress.
iseki
252 天前
不过这种破环兼容性的做法真是一言难尽
leonshaw
252 天前
这么说哪天 CPU 也可以不给 page

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1024389

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX