我在系统中安装了frame -c。
它的作用是,它将我所有的代码转换成更扩展的形式,包含所有C的隐式转换。
(如)//我的实际代码
if(opTab ==NULL || symTab ==NULL || intermediateFile==NULL || sourceCode ==NULL)
{
printf("nError in opening file streams");
exit(EXIT_FAILURE);
}
//Frama-c转换代码
if (opTab == (void *)0) {
printf((char const *)"nError in opening file streams");
exit(1);
}
else {
if (symTab == (void *)0) {
printf((char const *)"nError in opening file streams");
exit(1);
}
else {
if (intermediateFile == (void *)0) {
printf((char const *)"nError in opening file streams");
exit(1);
}
else {
if (sourceCode == (void *)0) {
printf((char const *)"nError in opening file streams");
exit(1);
}
}
}
}
我的疑问是,在创建对象程序之前,是否C编译器完成所有隐式转换?
或
在创建对象程序时,这些隐式转换是否并行进行?或
它依赖于实现?如果是,为什么?
printf
的第一个参数是const char*
类型,因此如果在使用printf
之前包含<stdio.h>
,则编译器将隐式执行转换。(也就是说,在这种情况下不需要强制转换。)
很可能不是。我不熟悉框架- C,但是你看到的转换是源到源的——也就是说,它把C源作为输入,然后给你修改过的C源作为输出。显然,它的工作是使代码更明确和详细。
C编译器通常不会执行这种源转换。(嗯,预处理器可以,但这是不同的。)
它将生成代码来执行所需的任何转换,但它将以机器语言或汇编语言或某种中间形式来完成。
举一个简单的例子:
int n = 42;
double x = n;
在初始化x
时执行从int到double的隐式转换,但在编译过程中可能不会创建类似
double x = (double)n;
C编译器接受C源代码作为输入。它们通常不会将其作为输出。理论上是可以的,但是他们没有理由这么做。
我是Frama-C开发人员之一。
你所看到的实际上是抽象语法树的文本表示,碰巧是可编译的C代码。正如您所注意到的,许多转换都是显式的。据我们所知,尽管可能会出现bug,但添加这些转换并不会改变程序的意义,因为这些转换是编译器根据C99标准第6.3节(特别是6.3.1.8"常用算术转换")无论如何都会进行的转换。
如果漂亮的打印代码,一旦编译,给出不同的结果,这是一个错误,您可以在Frama-C错误跟踪器上报告。