系统生成线程调用静态链接CRT是否存在安全风险?
系统回调线程调用静态链接CRT的安全性解析
结论先给:静态链接CRT时,从系统用CreateThread/CreateRemoteThread创建的这些回调线程里调用CRT是完全安全的,原因拆解如下:
- 静态链接的CRT是进程独占的副本,它的线程本地存储(TLS)是进程级别的。只要是进程内合法创建的线程(不管是系统用
CreateThread建的,还是你自己用_beginthread建的),静态CRT都会自动完成该线程的TLS初始化——静态CRT在进程启动时就把线程初始化逻辑绑定到了系统的线程创建回调上,不需要额外触发。 - 大家常说的
_beginthread/_beginthreadex必须搭配CRT用,那是针对动态链接CRT的场景。动态CRT是多个进程共享的,它没法自动感知每个进程里的新线程,必须用这两个函数手动触发线程TLS的初始化,否则调用CRT函数会导致内存泄漏甚至崩溃。但静态CRT完全没这个限制。
额外提醒:
- 就算你自己的代码里同时用
CreateThread和_beginthread创建线程,只要是静态链接CRT,也不会有冲突,各自的线程TLS都会被正确初始化。 - 但如果是动态链接CRT,那系统用
CreateThread创建的回调线程直接调用CRT函数就真的不安全了,必须想办法补做动态CRT的线程初始化(不过系统回调场景下很难这么做,所以动态CRT的话尽量避免在这些回调里调用CRT函数)。
内容的提问来源于stack exchange,提问作者OwnageIsMagic
相关产品推荐
相关产品推荐

