Создает ли компилятор неявно преобразованный код перед созданием объектного кода? - PullRequest
2 голосов
/ 04 августа 2011

Я установил 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 ]

2 голосов
/ 04 августа 2011

Первый аргумент printf имеет тип const char*, поэтому, если вы включили <stdio.h>, как и прежде, чем использовать printf, преобразование будет выполняться неявно компилятором.(Т.е. в этом случае нет необходимости в приведении.)

1 голос
/ 05 августа 2011

Я один из разработчиков Frama-C.

То, что вы видите, на самом деле представляет собой текстовое представление абстрактного синтаксического дерева, которое оказывается компилируемым C-кодом. Как вы заметили, многие преобразования сделаны явными. Насколько нам известно, и с возможностью появления ошибок, добавление этих преобразований не меняет смысла программы, потому что это преобразования, которые компилятор сделал бы в любом случае в соответствии с разделом 6.3 стандарта C99 (особенно 6.3. 1.8 «Обычные арифметические преобразования»).

Если напечатанный код после компиляции дает результаты, отличные от оригинала, это ошибка, о которой вы можете сообщить на трекере ошибок Frama-C .

1 голос
/ 05 августа 2011

Скорее всего, нет. Я не знаком с frama-c, но преобразование, которое вы видите, является источником-источником - то есть, он принимает источник C в качестве входных данных и дает вам измененный источник C в качестве выходных данных. Очевидно, его задача - сделать код более понятным и многословным.

Компилятор C обычно не выполняет такого рода преобразование исходного кода. (Ну, препроцессор, но это не так.)

Он будет генерировать код для выполнения любых необходимых преобразований, но он будет делать это либо в форме машинного языка, либо языка ассемблера, либо в некоторой промежуточной форме.

Чтобы взять простой пример, это:

int n = 42;
double x = n;

выполняет неявное преобразование из int в double при инициализации x, но, вероятно, ничто в процессе компиляции не приведет к созданию текста, который выглядит как

double x = (double)n;

Компиляторы C принимают исходный код C в качестве входных данных. Они вообще не генерируют это как вывод. Теоретически они могли, но у них нет причин для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...