在哪里可以找到gcc扩展属性的引用
在Linux内核compiler.h中,我找到了在哪里可以找到gcc扩展属性的引用,c,linux,gcc,kernel,C,Linux,Gcc,Kernel,在Linux内核compiler.h中,我找到了\uu iomem #定义(iomem)(noderef,地址(2)) 然后我知道\uuuu属性\uuuu(())是GCC的一个扩展。 但我在GCC.GNU.Org中找不到noderef或address_空间的引用 我只在中找到address\u space是扩展属性“\defineiomem\u属性((noderef,address\u space(2))” 浏览互联网,我可以找到以下详细信息: “iomem”的意思是两件不同的事情:它意味着稀疏
\uu iomem
#定义(iomem)(noderef,地址(2))
然后我知道\uuuu属性\uuuu(())
是GCC的一个扩展。
但我在GCC.GNU.Org中找不到noderef或address_空间的引用
我只在中找到address\u space是扩展属性“\defineiomem\u属性((noderef,address\u space(2))”
浏览互联网,我可以找到以下详细信息:
“iomem”的意思是两件不同的事情:它意味着稀疏应该抱怨
如果指针曾经被直接取消引用(它是一个“noderef”指针),
它位于“地址空间2”中,而不是普通的地址空间(0)
此地址空间(2)或地址空间(0)表示将内核空间或用户空间或iomem(如cpu环0)区分为环3
有关更多详细信息,请访问以下链接:-
我最近在Linux内核源代码中遇到了这个问题,也感到困惑。寻找答案并不是最简单的,我提供这个问题的答案是希望将来有人能看到答案,而不是在评论中遗漏答案 正如@marglisse正确指出的,您在GCC文档中找不到noderef或_address_space u,因为它们不是GCC属性。它们只对我们有意义。这就是为什么像
\uu iomem
这样的东西被如此定义的原因
#ifdef __CHECKER__
#define __iomem __attribute__((noderef, address_space(2)))
#else
#define __iomem
#endif
在“正常”编译下,宏已定义,但实际上已被忽略。如果启用了检查器(即稀疏),则会对其进行仔细检查
@alk在不久前发表了评论,提供了一个链接,其中Linus很好地解释了事情。2006年,我第一次看到这篇链接在这篇文章中的文章。奇怪的是,我的浏览器出于“安全原因”拒绝打开链接,我不得不在LKML档案中艰难地找到它
我希望这有助于理解正在发生的事情。自从你在2.5年前提出这个问题以来,你很可能发现情况就是这样
编辑 答案被否决了。考虑到这可能是因为我忽略了为
noderef
提供一个含义,我现在就提供一个。正如我在回答中提到的,这是一个信号,让sparse检查一些东西:指针的解引用。考虑这个简单的程序:
#include <stdio.h>
#ifdef __CHECKER__
#define __void_region __attribute__((noderef, address_space(2)))
#else
#define __void_region
#endif
int main(void)
{
int i;
void * __void_region pMemory = NULL;
pMemory = &i;
printf("i is: %d\n", *(int*)pMemory);
return 0;
}
基本上,该定义将
pMemory
的解引用通知稀疏到信号发生。这是一个毫无意义的程序,但在内核中,\uu iomem
永远不应该被取消引用,而只能通过适当的I/O内核API进行访问。这些东西实际上取决于操作系统本身的定义。noderef不是gcc属性,这就是为什么在gcc的文档中找不到它的原因…@marglisse,那么,noderef是什么,我知道\uu iomem
的意思,我的问题是在哪里可以找到noderef
和addresss\u space()
,我查了gcc.gnu.org,就是找不到。我对否决票感到有点困惑。我能更好地理解为什么吗?这确实回答了这个问题,或者至少是我认为的问题,“但是我在GCC.GNU.Org中找不到noderef或address_space的引用。”它们不在GNU文档中,因为它们不是GNU GCC的一部分。如果可以的话,我想让我的答案更好。
$ sparse foo.c
foo.c:14:9: warning: dereference of noderef expression
foo.c:16:37: warning: dereference of noderef expression