我在我的系统中安装了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编译器是否进行所有隐式转换?
或
是否在创建对象程序期间,这些隐式转换是否并行完成?
或
这是依赖于实现的吗?如果是这样,为什么?
答案 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上报告此错误。