S-Function 和 C/C++ 代码的支持限制和注意事项
在 Simulink Design Verifier 中启用 S-Function
Simulink® Design Verifier™ 支持为使用 Embedded Coder® 生成的代码生成测试用例。Simulink Design Verifier 还支持对符合以下条件的 S-Function 进行错误检测、测试用例生成和属性证明:
由代码继承工具生成,并且
def.Options.supportCoverageAndDesignVerifier
设置为 true。由 S-Function Builder 生成,并且在 S-Function Builder 对话框的编译信息选项卡上选择了启用对 Design Verifier 的支持。
由函数
slcovmex
编译,并且在编译 S-Function 时将选项-sldv
传递给了该函数。
有关这三种方法的详细信息,请参阅如何创建 C MEX S-Function。
S-Function 和 C/C++ 代码的支持限制
Simulink Design Verifier 不支持包含以下内容的 S-Function 或 C/C++ 代码:
连续状态。Simulink Design Verifier 不会分析此类代码。
过零函数。Simulink Design Verifier 会在分析过程中忽略此类代码。
描述 INF 或 NaN 对象的常量。Simulink Design Verifier 会将此类代码视为包含浮点溢出错误。尽管 Simulink Design Verifier 分析无法确定此类情况下的溢出错误类型,但该分析可以确定哪些代码行引入了不兼容性问题。Polyspace® 可以提供有关您的代码为何包含浮点溢出错误的详细信息。
易失性常量和变量。Simulink Design Verifier 通过插桩支持易失性变量和常量。包含易失性变量或常量的模型是兼容的,可以进行分析,但分析可能会导致目标由于插桩而未决。
当 Stateflow® 图引用了 C/C++ 代码时,软件将仅分析 C/C++ 代码的外部可见符号。头文件中定义的静态变量或函数等仅在内部可见的符号会引入桩件。要解决此问题,您可以将它们替换为外部变量和函数。
当您启用导入自定义代码选项或在仿真目标和代码生成自定义代码设置中定义了相同的 C 函数时。
当您在多个模型中定义自定义代码时,系统会同时分析这些模型中的所有代码。如果无法同时解析所有代码或多次定义 C/C++ 代码,则会导致自定义代码被插桩。
您必须指定进入使用
slcovmex
编译的 S-Function 端口的信号元素是连续的。使用SimStruct
函数 ssSetInputPortRequiredContiguous。
Simulink Design Verifier 支持 S-Function 和 C/C++ 代码的以下设计错误:
包括活动逻辑的死逻辑。
数组越界。如果是 C/C++,则包括指针越界。
除以零。
将易失性变量作为普通变量处理
Simulink Design Verifier 允许选择将易失性变量插桩或作为普通变量处理。当您选择忽略 volatile 限定符参数时,易失性元素将与非易失性元素同等对待。取消选择忽略 volatile 限定符将还原为之前对易失性元素进行插桩访问的行为。
在 Simulink Design Verifier 中启用 S-Function 和 C/C++ 代码的注意事项
在对启用了 S-Function 的模型或使用 Embedded Coder 生成的 C/C++ 代码执行属性证明或测试生成分析时,Simulink Design Verifier 假定代码不包含运行时错误。如果代码包含运行时错误(例如除以零、访问未初始化的变量或数组越界),则属性证明或测试生成分析可能会产生错误结果。经过 Polyspace 检查且没有运行时错误的代码将在 Simulink Design Verifier 分析中提供正确结果。
为避免由于运行时错误而产生错误结果,请先执行设计错误检测分析,然后再执行属性证明或测试生成分析。
如果 Simulink Design Verifier 无法确定代码中数组的大小(例如,对于动态分配且大小为非常量的数组),Simulink Design Verifier 会为该数组假定一个上限。请确保给定的上限合适。
如果您未启用 Simulink Design Verifier 对 S-Function 的支持,Simulink Design Verifier 会对 S-Function 进行插桩。启用 S-Function 支持后,Simulink Design Verifier 会分析 S-Function 的内容以获取更详细的信息。有时,Simulink Design Verifier 会在内部对 S-Function 进行插桩。内部插桩可能是由不同的 C/C++ 构造引起的,例如:
调用库函数(库函数被桩件替换)。
复数指针运算。
转换为不兼容或未知的指针类型或从不兼容或未知的指针类型进行转换。
包含此类构造的模型被标记为部分兼容。
源代码保护
为了分析 S-Function 的内容,有关 S-Function 实现的信息(包括从源代码派生的信息)存储在共享对象中。虽然用户无法直接访问这些信息,但如果 S-Function 包含敏感源代码,请考虑在外部发布的模型中禁用 Simulink Design Verifier 对 S-Function 的支持。