IA64上容易犯的错误
在周五的时候,我在一篇文章里讲述了错误的函数原型可能会造成的一些奇奇怪怪的问题。在IA64架构处理器上,如果使用了不相匹配的函数原型,则你还会碰到一些可能是比较致命的问题,虽然可能代码看起来没有大的问题。那我们下面具体就来看看。
Win32里有一个CreateThread的API函数,它会接受一个类型为LPTHREAD_START_ROUTINE的函数指针,它需要客户传递形如下面原型的函数: DWORD CALLBACK ThreadProc(LPVOID lpParameter);
有些朋友喜欢做的事情之一就是:将一个无返回值(void)的函数强制转换为LPTHREAD_START_ROUTINE类型并将函数指针传递给CreateThread。 如果开发者真的这样做了,则他实际在向编译器传递这样的信息: “我并不关心这个返回值,所以这里我使用了一个无返回值的函数作为线程的函数指针,我知道可能会得到垃圾数据作为返回值,但是那样也没事。” 类似于下面的代码:
实际上,类似这样有缺陷的代码还有很多,大家可以直接搜索关键字”CreateThread LPTHREAD_START_ROUTINE”,就可以找到它们。Microsoft甚至还专门发布了一篇白皮书来讲述这种误用函数原型可能会在Win64上导致一些问题。
看起来很有意思,但出问题的时候,就不那么好玩了。
在IA64架构上,每一个64位寄存器实际上是65位长度的。多出来的一位我们叫做”NaT”,也即”Not A Thing