Compiler在创建目标代码之前是否生成隐式转换的代码?

时间:2011-08-04 18:40:11

标签: c compiler-construction implicit-conversion frama-c

我在我的系统中安装了frama-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编译器是否进行所有隐式转换?

是否在创建对象程序期间,这些隐式转换是否并行完成?

这是依赖于实现的吗?如果是这样,为什么?

3 个答案:

答案 0 :(得分:2)

printf的第一个参数是const char*类型,因此如果您在使用<stdio.h>之前包含printf,则转换将由编译器隐式执行。 (即,在这种情况下,不需要演员。)

答案 1 :(得分:1)

很可能不是。我不熟悉frama-c,但你看到的转换是源到源 - 即,它需要C源作为输入,并为你提供修改后的C源作为输出。显然,它的工作是使代码更加明确和冗长。

C编译器通常不会执行这种源转换。 (嗯,预处理器确实如此,但那是不同的。)

它将生成代码以执行所需的任何转换,但它将以机器语言,汇编语言或某种中间形式的形式执行。

举一个简单的例子,这个:

int n = 42;
double x = n;

在初始化x时执行从int到double的隐式转换,但编译过程中可能没有任何内容会创建看起来像

的文本
double x = (double)n;

C编译器将C源代码作为输入。它们通常不会将其生成为输出。理论上他们可以,但他们没有理由这样做。

答案 2 :(得分:1)

我是Frama-C开发人员之一。

您所看到的实际上是抽象语法树的文本表示,恰好是可编译的C代码。正如您所注意到的,很多转换都是明确的。据我们所知,并且有可能存在漏洞,添加这些转换并不会改变程序的含义,因为这些转换是编译器根据C99标准的6.3节(特别是6.3)所做的转换。 1.8“通常的算术转换”)。

如果精美打印的代码在编译后会提供与原始代码不同的结果,则可以在the Frama-C bug tracker上报告此错误。