在为Windows操作系统的应用程序实现我自己的C运行时解决方案时,我面临以下问题:
每个执行时间__security_cookie
都应该获得一个具有selectany属性的随机值(使用__declspec(selectany)
(。但它不是。。。因此,在64位版本的应用程序中,每次它都具有默认值0x00002B992DDFA232
。它会导致一个错误(全局安全检查失败(。
我使用Clang版本14来编译我的代码。
GlobalSecurity.c:/strong>
#if defined (_WIN64)
#define DEFAULT_SECURITY_COOKIE 0x00002B992DDFA232
#else
#define DEFAULT_SECURITY_COOKIE 0xBB40E64E
#endif
// Global security cookie
__declspec(selectany) UPtr __security_cookie = (UPtr)DEFAULT_SECURITY_COOKIE;
__declspec(selectany) UPtr __security_cookie_complement = ~((UPtr)DEFAULT_SECURITY_COOKIE);
GlobalSecurity.h
...
// Global security cookie
extern UPtr __security_cookie;
extern UPtr __security_cookie_complement;
typedef union
{
unsigned __int64 ft_scalar;
FILETIME ft_struct;
} FT;
// Initializes global security cookie
void CDECL __security_init_cookie()
{
if (__security_cookie != DEFAULT_SECURITY_COOKIE
#if defined (_M_IX86)
&& (__security_cookie & 0xFFFF0000) != 0
#endif
)
{
__security_cookie_complement = ~__security_cookie;
return;
}
...
为什么__security_cookie
不能正常工作?如何解决这个问题?
第页。S.:UPtr与UINT_PTR 相同
selectany
不会给你一个随机数,即使它的目的是为了避免"使用未初始化的变量";警告,您的代码正在分配给变量!
selectany
属性允许在多个转换单元中声明和初始化相同的全局变量。