gpt4 book ai didi

c - 如何在编译时执行接口(interface)契约(在 C 中)?

转载 作者:太空狗 更新时间:2023-10-29 15:30:47 26 4
gpt4 key购买 nike

背景:

我们正在为一个新的嵌入式系统建模固件。目前正在用 UML 对固件进行建模,但不会使用 UML 建模工具的代码生成功能。

目标语言将是 C(具体来说是 C99)。

低功耗(即性能、快速执行)和正确性很重要,但正确性是重中之重,高于一切,包括代码大小和执行速度。

在为系统建模时,我们确定了一组定义明确的组件。每个组件都有自己的接口(interface),许多组件与许多组件交互。

模型中的大多数组件将是实时操作系统 (RTOS) 下的独立任务(线程),尽管有些组件只不过是库。任务完全通过消息传递/队列发布相互通信。与库的交互将采用同步函数调用的形式。

因为意见/推荐可能取决于规模,我将提供一些信息。现在可能有大约 12-15 个组件,可能会增加到 20 个左右?不是 100 多个组件。假设平均而言,每个组件与 25% 的其他组件交互。

component diagram ,有端口/连接器用于表示组件之间的接口(interface),即一个组件提供另一个组件所需的东西。到目前为止一切顺利。

难点在于:在很多情况下我们不希望“组件 A”访问所有“组件 B”的接口(interface),即我们希望将组件 A 限制为组件 B 提供的接口(interface)的子集。

问题/问题:

是否有一种系统的、相当直接的方式来执行(最好是在编译时)在组件图上定义的接口(interface)契约?

显然,编译时解决方案优于运行时解决方案(更早的检测、更好的性能、可能更小的代码)。

例如,假设库组件“B”提供函数 X()、Y() 和 Z(),但我只希望组件“A”能够调用函数 Z(),而不是 X() 和Y()。类似地,即使组件“A”可能能够通过其消息队列接收和处理大量不同的消息,我们也不能让任何组件能够向任何组件发送任何消息。

我能想到的最好办法是为每个组件-组件接口(interface)设置不同的头文件,并且只公开(通过头文件)允许组件使用的接口(interface)部分。显然,这可能会导致产生大量的头文件。这也意味着组件之间的消息传递不会直接使用 OS API 完成,而是通过函数调用完成,每个函数调用构建并发送特定(允许的)消息。对于同步调用/库,只会公开允许的 API 子集。

对于这个练习,你可以假设人们会表现得很好。换句话说,不要担心人们直接欺骗、剪切和粘贴函数原型(prototype),或者包括他们的头文件不允许。如果不允许,他们不会直接将消息从“A”发布到“B”,等等...

也许有一种方法可以通过编译时断言来执行契约(Contract)。也许有一种更优雅的方法可以在运行时检查/强制执行此操作,即使它会产生一些开销。

代码必须干净地编译和 lint,所以“函数原型(prototype)防火墙”方法是可以的,但似乎可能有更惯用的方法来做到这一点。

最佳答案

标题的想法是合理的,但是,根据您的组件之间的交错,将每个组件的接口(interface)划分为多个具有自己的头文件的子类别而不是提供头文件可能会更清晰对于每个组件-组件-连接。

子类别不一定是不相交的,但要确保(通过预处理器指令)您可以混合类别而无需重新定义;这可以以系统的方式实现,方法是为每个类型或函数声明创建一个带有自己的包含保护的头文件,然后从这些原子 block 构建子类别头文件。

关于c - 如何在编译时执行接口(interface)契约(在 C 中)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4027449/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com