2

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

或者

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

或者

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

4

3 回答 3

2

的第一个参数printf是 type const char*,所以如果你<stdio.h>在 using 之前包含printf了,转换将由编译器隐式执行。(即,在这种情况下不需要演员表。)

于 2011-08-04T18:56:10.873 回答
1

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

AC 编译器通常不会执行那种源代码转换。(好吧,预处理器可以,但那是不同的。)

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

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

int n = 42;
double x = n;

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

double x = (double)n;

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

于 2011-08-04T20:54:26.767 回答
1

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

您所看到的实际上是抽象语法树的文本表示,恰好是可编译的 C 代码。正如您所注意到的,许多转换都是显式的。据我们所知,并且有可能出现错误,添加这些转换不会改变程序的含义,因为这些转换是编译器根据 C99 标准的 6.3 节(尤其是 6.3.3)无论如何都会做出的转换。 1.8“通常的算术转换”)。

如果漂亮打印的代码在编译后给出与原始代码不同的结果,这是一个错误,您可以在Frama-C 错误跟踪器上报告。

于 2011-08-04T22:37:24.997 回答