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

2024-03-17 09:03:08 +08:00
 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 用户暂缓升级
17347 次点击
所在节点    Apple
109 条回复
codehz
2024-03-17 11:39:23 +08:00
@lslqtz 我怀疑可能是有什么延迟上的差异导致泄露信息🤔
codehz
2024-03-17 11:44:14 +08:00
@felixlong 目前据我所知只有 java 在广泛使用这个技巧,其他 jit 都没这么做
不过数组越界肯定不会用这个方法,总不能一个数组刚好吃一个 4k 页面(apple silicon 好像是 16k),然后上下两侧摆 guard page ,这也太奢侈了
至于空指针,支持 jit 的语言里有空指针暴露给用户的就挺少的了 js 肯定不是,go 和 net 据我所知也没人说有做类似优化
Evrins
2024-03-17 13:31:23 +08:00
14.4 一发布就升级了
Goland RustRover DataGrip 都用的好好的
eailfly
2024-03-17 13:36:00 +08:00
只影响 Apple silicon 版本,还在用 Intel 2019 的一下子就放心了
a66243766
2024-03-17 13:41:02 +08:00
我就说我的 goland 最近一直崩溃
neiltroyer849
2024-03-17 14:40:08 +08:00
似乎应该是与 Apple Silicon 自 A11 开始引入的 Fast Permission Restrictions 有关系。原来是在 iOS 上的,后来 Mac 上了 AS 因而 macOS 也支持了这种 per thread 的权限限制?
iseki
2024-03-17 14:43:01 +08:00
这有点坑啊,这种重大变更怎么能无预警直接推呢,至少也应该保留一个逃生门。
iseki
2024-03-17 14:44:54 +08:00
@rainbowmolly 触发段错误信号的行为是良定义+可保证的,如果能用来提升性能为啥不能用。你说的直接退出只是因为没有好好处理段错误信号吧。
iseki
2024-03-17 14:59:31 +08:00
@codehz Go 写的程序可能也受影响,它的空指针访问也是可以在程序内部捕获的,而且好像也是通过段错误信号兜住的(只观察过 Linux/Windows 平台)
codehz
2024-03-17 15:37:19 +08:00
@iseki 啊,写错了,是要有 jit ,还得刚好处于 write 的状态触发
jay2049
2024-03-17 15:44:23 +08:00
感谢楼主提醒
coang
2024-03-17 15:52:21 +08:00
优秀的系统,垃圾的 JDK,居然能影响这么多个版本 Java 怎么做的兼容性测试!!(狗头
ipcjs
2024-03-17 16:50:12 +08:00
Windows 用的 beta 版都从来没问题,macOS 升一次一堆软件出问题,老早把那个傻 diao 自动升级关掉了💩
ShadowPower
2024-03-17 17:22:32 +08:00
上星期已经被坑了,感觉 mac 做开发的体验真的不如 Windows 了……
Windows 的稳定版我都随意更新
codehz
2024-03-17 17:25:43 +08:00
找到了一个问题复现的代码
#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
2024-03-17 17:36:13 +08:00
MAC 现在确实不敢随意更新版本, 说不定什么刚需软件就工作不正常了, 很难受。
tt0411
2024-03-17 17:41:26 +08:00
怪不得 clion 时不时 crash...
iseki
2024-03-17 17:44:22 +08:00
@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
2024-03-17 17:47:23 +08:00
不过这种破环兼容性的做法真是一言难尽
leonshaw
2024-03-17 19:21:50 +08:00
这么说哪天 CPU 也可以不给 page

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

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

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

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

© 2021 V2EX