2016-12-11 23 views
4

在linux内核(版本4.8)中, “struct pid”定义如下(来自文件:http://lxr.free-electrons.com/source/include/linux/pid.h)。这里“numbers [1]”(在第64行)是一个只能有一个元素的静态数组(因为数组大小被称为1)。数组中的元素数量是否可以比编译时定义的数组大小更多?

57 struct pid 
58 { 
59   atomic_t count; 
60   unsigned int level; 
61   /* lists of tasks that use this pid */ 
62   struct hlist_head tasks[PIDTYPE_MAX]; 
63   struct rcu_head rcu; 
64   struct upid numbers[1]; 
65 }; 

但随后,在线路319和320下面的代码(从文件:http://lxr.free-electrons.com/source/kernel/pid.c),阵列 “数字” 是内部的for循环 '号码[I]'。它甚至是正确的,因为变量'i'不能具有零以外的任何值而不会导致分段错误?我在循环中检查了'i'的值,看它是否超过1.是的,但仍然没有看到任何分段错误。我在这里错过了什么吗?

297 struct pid *alloc_pid(struct pid_namespace *ns) 
298 { 
299   struct pid *pid; 
300   enum pid_type type; 
301   int i, nr; 
302   struct pid_namespace *tmp; 
303   struct upid *upid; 
304   int retval = -ENOMEM; 
305 
306   pid = kmem_cache_alloc(ns->pid_cachep, GFP_KERNEL); 
307   if (!pid) 
308     return ERR_PTR(retval); 
309 
310   tmp = ns; 
311   pid->level = ns->level; 
312   for (i = ns->level; i >= 0; i--) { 
313     nr = alloc_pidmap(tmp); 
314     if (nr < 0) { 
315       retval = nr; 
316       goto out_free; 
317     } 
318 
319     pid->numbers[i].nr = nr; 
320     pid->numbers[i].ns = tmp; 
321     tmp = tmp->parent; 
322   } 
+1

这不是“正确”至于C标准而言,那不过是兴趣不大的Linux内核开发的。它可能对他们“起作用”。 (当然,后备内存是动态分配的。)C99使用数字[]'正确支持这种结构,但Linux不使用C99。) –

+0

嗨Kerrek,感谢您的快速回复。如果它不正确,那么为什么它不会导致任何seg故障? – psin

+0

@psin:C中的任何内容都不能保证你的段错误。一个不正确的程序可能会发生按预期行事。代码大概只能使用已知行为的工具来构建。 –

回答

0

是否有可能具有在一个数组元素比数组的大小更其在编译时定义的数目?

是的。这是拨打电话未定义的行为和代码不应被写入允许。

它是如何正确的,因为变量'我'不能有任何值以外的零而不会导致分段错误?

这是可能的;因为代码违反了合同。写数组的界限外可能工作。它可能会使程序崩溃。这是未定义的行为。未指定


C至防止其边界之外数组访问也不引起赛格故障。这种访问可能被捕获或不被捕获。代码本身需要负责确保访问在范围内。
有没有用C指定training wheels和几个safety nets

+0

感谢chux。我发现很难理解内核主线稳定代码是越野车。在内核版本3.16中,数组“numbers”被声明为“numbers [0]”,它是一个不允许元素的数组,但它被用来访问该数组中的元素。 “数字”被用作结构指针而不是静态结构数组吗? – psin

+0

数组“数字[0]”不是可移植的C.通常情况下,struct pid的内存被分配了额外的内存以允许最后一个字段(一个数组)超过1个元素,直到所需的大小。更现代的方法是使用_flexible array_。请参阅http://stackoverflow.com/q/11733981/2410359这可能是更多发生的事情而不是不正确的内核代码。 – chux

+0

...或http://stackoverflow.com/q/14643406/2410359 – chux

相关问题