Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在哪里可以找到gcc扩展属性的引用_C_Linux_Gcc_Kernel - Fatal编程技术网

在哪里可以找到gcc扩展属性的引用

在哪里可以找到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”的意思是两件不同的事情:它意味着稀疏

在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”的意思是两件不同的事情:它意味着稀疏应该抱怨 如果指针曾经被直接取消引用(它是一个“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