C 文件未检测覆盖率,错误的 expr 节点类型

C file not instrumented for coverage, bad expr node kind

我正在使用 MATLAB 中的 legacy_code 工具来生成一些 S 函数,然后我希望这些 S 函数由 simulink 覆盖工具箱进行分析。

我也在这里问,因为这可能是一个 C 问题,与 MATLAB 无关。

我将标志设置为真,以便在使用 legacy_code 工具生成 S 函数时使用覆盖工具箱。

def.Options.supportCoverage = true;

但我在编译时遇到以下错误,我在 windows 中使用 MATLAB 的 MinGW 64 位编译器。

“lib_control.c", line 254: error: bad expr node kind (b:\matlab\polyspace\src\shared\cxx_front_end_kernel\edg\src\cp_gen_be.c, line 14084) Warning: File "lib_control.c" not instrumented for coverage because of previous error In codeinstrum.internal.LCInstrumenter/instrumentAllFiles In codeinstrum.internal.SFcnInstrumenter/instrument In slcovmexImpl In slcovmex (line 48) In legacycode.LCT/compile In legacycode.LCT.legacyCodeImpl In legacy_code (line 101) In generate_sfun (line 70)

在C代码中我有以下几种函数:

void controller( int n_var,
             double my_input,
             double my_output )
{
    double my_var[n_var];    
    for ( int i=0; i<n_var; i++ )
    {
        my_output = my_input + my_var[i];
    }
}

编译器抱怨这一行:

double my_var[n_var];

我是否必须像这样声明变量,以便将它们包含在覆盖率分析中?

这个错误是来自 MATLAB 还是文件检测的 C 错误?

如果我在没有覆盖标志的情况下进行编译,则不会出现任何问题,并且生成的 S 函数不会出现警告。

您的代码似乎因问题而无法运行。 首先尝试像这样声明 my_var

double *my_var = malloc(n_var * sizeof(double));
memset(my_var, 0, n_var * sizeof(double));

这是根据函数参数分配内存的正确方法。 还有一个问题。

my_output = my_input + my_var[i];

所以这是正确的解决方案。

*my_output = *my_input + my_var[i];

您将要更改堆栈寄存器变量参数的值 在C语言中,参数是保存在栈寄存器中的,函数结束后会被释放。 所以它不会反映任何变化

为此,您需要将变量指针作为参数发送

void controller( int n_var,
         double *my_input,
         double *my_output ) {
    *my_output = ....; // like this
}

在调用方,你可以这样做。

double a, b;
controller(10, &a, &b);

希望对您有所帮助