OpenSSL CVE-2022-3786中两种sizeof运算符用法的差异解析
关于OpenSSL CVE-2022-3786中sizeof用法的解析
你的理解完全错误,sizeof *pDecoded和sizeof (*pDecoded)的结果完全一致,都会返回unsigned int类型的大小,而非指针的大小。
原因在于C语言的运算符规则:
sizeof是单目运算符,操作数可以是类型名或表达式。当操作数是表达式时,sizeof计算的是该表达式最终的类型大小。*pDecoded是间接寻址表达式,pDecoded是unsigned int*类型指针,*pDecoded代表指针指向的对象,其类型为unsigned int。- 括号
(*pDecoded)仅改变书写形式,并未改变表达式的类型——它依然指向unsigned int类型对象,因此sizeof计算结果和不带括号的写法完全相同。
若要获取指针本身的大小,正确写法是sizeof pDecoded或sizeof(unsigned int*),这会返回当前平台下指针类型的字节数(例如32位系统为4字节,64位系统为8字节)。
在CVE-2022-3786的场景中,漏洞根源是整数溢出导致内存拷贝使用了错误长度值,和这两种sizeof写法的差异无关——因为二者本质等价。
内容的提问来源于stack exchange,提问作者philcolbourn
相关产品推荐
相关产品推荐

