diff -u:内核开发新特性

作者:Zack Brown

Linus Torvalds 报告了一些他认为不必要的 GCC 编译器警告,并给出了他对这些警告应该如何工作的看法。具体来说,GCC 5.1 会针对使用布尔变量的 switch 语句发出警告,大概是因为布尔变量最好用简单的 if 语句处理。

Linus 发布了以下反例


switch (a) {
case 1:
    A;
    if (b)
         break;
    B;
    /* fallthrough */
case 2:
    C;
}

他说

您在某些条件下共享该 C case,但在其他条件下则不共享。

当然,您可以使用 goto 做同样的事情,但您不能使用纯嵌套的 if () 语句来做。

因此,即使只有两种情况,switch () 在语法上也比 if () 更强大,因为它允许更结构化的退出。

Linus 说,GCC 更合适的警告应该是当 switch 变量的数据类型与 case 变量的数据类型不同时。他说,在这种情况下,警告是完全有道理的。但他认为,警告完全不要在 switch 中使用布尔变量是过分的。他说


switch (boolean) {
case true:

比遵循 GCC 文档中将布尔值强制转换为整数的建议更有意义


switch ((int)boolean) {
switch 1:

他说,任何喜欢后者胜过前者的人“显然完全没有品味,并且客观上是错误的”。

Tadeusz Struk 提出了一些补丁,以实现新的公钥加密 API。其想法是在没有加密硬件可用时使用软件例程,但在可能的情况下将工作卸载到硬件。但总的来说,任何模块都可以提供自己的 RSADSA 实现。

这并非完全是新概念——内核已经支持公钥加密来验证数字签名的驱动程序模块。但是,Tadeusz 的代码旨在替换旧的加密代码。除了他实现该功能的补丁之外,Tadeusz 还提交了将旧用法迁移到新服务的补丁。

有一些技术建议和一些小的反对意见,但最终,旧的加密代码似乎将被 Tadeusz 的新代码所取代。最大的问题似乎是如何让用户代码轻松处理仅实现 RSA 和 DSA API 部分子集的驱动程序。最初,Tadeusz 计划允许驱动程序简单地编码他们提供的功能列表,但 Herbert Xu 说服他要求驱动程序至少实现完整的最少功能子集,以便用户可以依赖它们而无需进行大量测试。

文件系统功能 仍然没有发挥作用。最初旨在作为一种在不完全以 root 身份运行的情况下放宽对用户进程的有针对性的安全约束的方法,但功能的糟糕初始设计有时导致的安全问题多于它解决的问题。

一个问题是功能继承——一个进程将其相同的功能集传递给它调用的进程的能力。这相当于用户进程以该用户身份运行子进程,或 root 进程以 root 身份运行子进程——这是 UNIX 一直支持的。但是功能没有正确实现该功能,并且可用的解决方法往往使怀有敌意的用户更容易在系统上获得 root 权限。

最近,Andy LutomirskiChristoph LameterSerge Hallyn 的想法的基础上,提出了一些补丁,这些补丁以一种新的方式重新构想了功能继承,他们声称在不破坏当前用法的情况下,这将提供一种更合理、更安全的功能继承形式。

功能通过识别给定进程可用的安全能力来工作。一个进程拥有一组特定的功能,然后可以将其屏蔽掉,只留下该进程实际需要的功能。这些掩码之一是“可继承”掩码,称为 pI。 pI 掩码应该控制哪些功能可以被子进程继承。问题是它没有正确地做到这一点,尽管改变它的行为可能会破坏现有的用户代码。

Andy 的代码通过引入新的 pA 掩码来绕过这个困境,他说 pA 掩码将完成 pI 原本应该做的事情。 Andy 说,pA 掩码将引入新的逻辑和一些细微的行为,以允许可预测的继承形式,从而避免一直困扰用户的安全漏洞。

一些人指出,Andy 也承认,这不是一个完美的解决方案,并且留下了一些未解决的问题。但他说,底线是他的代码代表了真正的改进,并且在没有人能够提供超出现状的任何替代方案的情况下,代表了更好的整体方向。

Zack Brown 是 Linux JournalLinux Magazine 的技术记者,并且是“Kernel Traffic”每周新闻通讯和“Learn Plover”速记打字教程的前作者。他于 1993 年在他的 386 电脑上安装了 Slackware Linux,配备了 8MB 内存,并被开源社区彻底震撼。他是纯策略棋盘游戏 Crumble 的发明者,您可以用几块纸板自己制作。他还喜欢写小说、尝试动画、改革拉班舞谱、设计和缝制自己的衣服、学习法语以及与朋友和家人共度时光。

加载 Disqus 评论