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);
希望对您有所帮助
我正在使用 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);
希望对您有所帮助