我正在使用以下代码从根窗口中读取_NET_ACTIVE_WINDOW
原子:
Atom actualType;
int actualFormat;
unsigned long nItems, bytesAfter;
unsigned char * value;
if (XGetWindowProperty(display, window, atom, 0, LONG_MAX / 4,
False, XA_WINDOW,
&actualType, &actualFormat,
&nItems, &bytesAfter, &value) != Success ||
actualType != XA_WINDOW) {
return NULL;
}
Window result = *(Window*)value; /* <=== this line seems dubious */
XFree(value);
return result;
然而,尽管它有效,但我很确定它有问题,因为添加一些printfs会显示:
sizeof(Window)
是8 actualFormat
是32 nItems
是1 因此,根据文档,为属性分配的缓冲区长度为4个字节。从中读取一个窗口是一个明显的溢出。
那是什么处理?是否有一些我想念的标志Window
只有4个字节?我应该将该值读作uint32_t
并将其投放到Window
之后吗?还有什么吗?
答案 0 :(得分:2)
文档(XGetWindowProperty(3))声明:
如果指定的格式为32,则属性数据必须是长数组。
包含文件将XID
显示为unsigned long
的typedef,这是unsigned long
的typedef。
我猜想32的使用是不合时宜的并且用来表示32位,但现在意味着编译器选择用于FormEvents
的任何内容。