如何在不影响性能的情况下实现原始类型的类型安全?

问题描述 投票:0回答:1

我希望 C 编译器检查简单类型的用法。我的首选用法是检查

typedef
,但即使使用
-Wall
-Wextra
也没有完成:

#include <math.h>
#include <stdio.h>

typedef float deg;
typedef float rad;

float sinus( rad angle ) {
    return sin( angle );
}

int main() {
    deg a = 180;
    printf( "The sinus of %g is %g\n", a, sinus(a));
    return 0;
}

编译顺利。

所以我正在考虑使用单成员结构:

#include <math.h>
#include <stdio.h>

typedef struct { float value; } deg;
typedef struct { float value; } rad;

float sinus( rad angle ) {
    return sin( angle.value );
}

int main() {
    deg a = {.value=180};
    printf( "The sinus of %g is %g\n", a, sinus(a));
    return 0;
}

这给出了一个彻底的错误(这是应该的)。不过,我对表演感到好奇。如果我更正上述示例,则生成的二进制文件具有相同的大小,无论是否经过优化。然而,生产的组件有所不同。即使在更复杂的上下文中,编译器也能优化

struct
吗?如果没有,是否有另一种方法来实现原始类型的类型安全?

我正在使用 GCC (9.1.0),但如果有帮助的话我会考虑 llvm。这应该适用于常见的桌面架构,即 x86、x86_64、ARM。

编辑:我注意到您也可以在上面的示例中使用

union
代替
struct
。这再次产生略有不同的汇编代码,并且我再次不清楚现实世界的性能后果。

c compiler-errors type-safety
1个回答
2
投票

我希望 C 编译器检查简单类型的用法。我的首选用法是检查 typedef,但这还没有完成

使用 recent GCC 的一种可能方法可能是在您的 typedef(或

__attribute__
-s)上添加额外的
#pragma
并编写您自己的 GCC 插件 进行检查(也许同时使用 type推理抽象解释技术)

请注意,您想要的功能超出了标准 C 的语义,例如在n2176.

如果允许(并获得资助),我可能会(在 2021 年春季)扩展 Bismon 静态分析器(在此 DRAFT 报告中描述)以实现您的目标。另请参阅 CHARIOTDECODER 项目。

另一种方法是设计自己的编程语言,并编写编译器生成 C 代码。那么ACM SIGPLAN会议是相关的。

或者根据您的需求调整 Frama-CClang 静态分析器

在所有情况下,都要预算几个月的专业软件工程师的劳动力。请注意赖斯定理

您梦想的检查可以“部分”自动化,但需要昂贵的开发成本。 您的问题与

维度分析

有关:以米为单位的距离除以以秒为单位的持续时间得出速度。还有单位(角度可以以弧度和度为单位) IIRC,一些航天器已经因为这样的错误而丢失了。

© www.soinside.com 2019 - 2024. All rights reserved.