Frama-C内核用户错误:全局初始化程序tmp无效?

时间:2018-12-21 22:44:50

标签: frama-c

在frama-c内核解析期间,得到“用户错误:无效的全局初始化器tmp”。使用gcc可以很好地编译源代码。它与frama-c有关,后者对带有内存位置的条件运算符使用了'tmp'变量。在不更改源代码的情况下如何解决此错误的任何想法?代码的简化版本在下面复制。

如果我像FILL_OK宏中那样对条件表达式进行硬编码,那就可以了。如果我将第8-15行移到main()中,那没关系。

#define FILL_OK() {.a = 0 == 0 ? 0 : 1 }
#define FILL_NOK() {.a = 0 == flag ? 0 : 1 }

typedef struct {
     int a;
} a_st;

int flag = 0;

a_st buff_b[] =
{
    FILL_OK(),
    FILL_NOK(),
};

int main()
{
    return(0);
}

命令行副本和错误输出:

frama-c -val main0.c

[kernel] Parsing main0.c (with preprocessing)
[kernel] main0.c:10: User Error: 
  invalid global initializer tmp

                             {/*()  <- flag
                              Calls:

                              */

                              if (0 == flag) 
                                tmp = 0;
                              else 
                                tmp = 1;}
[kernel] User Error: stopping on file "main0.c" that has errors. Add '-kernel-msg-key pp'
  for preprocessing command.
[kernel] Frama-C aborted: invalid user input.

1 个答案:

答案 0 :(得分:1)

目前尚无办法像Frama-C那样接受此代码,因为初始化器内部表达式的“语言”要求每个初始化器都是一个常量。我发现的侵入性较小的代码修改是将flag转换为宏。