我希望 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 编译器检查简单类型的用法。我的首选用法是检查 typedef,但这还没有完成
使用 recent GCC 的一种可能方法可能是在您的 typedef(或
__attribute__
-s)上添加额外的 #pragma
并编写您自己的 GCC 插件 进行检查(也许同时使用 type推理和抽象解释技术)
请注意,您想要的功能超出了标准 C 的语义,例如在n2176.
如果允许(并获得资助),我可能会(在 2021 年春季)扩展 Bismon 静态分析器(在此 DRAFT 报告中描述)以实现您的目标。另请参阅 CHARIOT 和 DECODER 项目。
另一种方法是设计自己的编程语言,并编写编译器生成 C 代码。那么ACM SIGPLAN会议是相关的。
或者根据您的需求调整 Frama-C 或 Clang 静态分析器。
在所有情况下,都要预算几个月的专业软件工程师的劳动力。请注意赖斯定理。
有关:以米为单位的距离除以以秒为单位的持续时间得出速度。还有单位(角度可以以弧度和度为单位) IIRC,一些航天器已经因为这样的错误而丢失了。