问题标签 [safety-critical]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 安全关键系统中的封装
通常安全关键系统是否使用封装?假设一个用Ada或C实现的嵌入式系统,用于卫星、喷气式战斗机、潜艇或客机。
我得到了这个问题,因为对我来说,封装的概念是为了帮助软件开发和维护过程,而不是软件本身。由于通过访问器而不是直接在内存中访问来访问数据会增加一点开销,我想知道这样一个安全关键的应用程序是否可以接受像封装这样的抽象层。
此外,我假设有大量代码为客机提供动力,所以如果他们不想将这些概念放在机上,那么软件开发可能会在某个时候失控。
PS如果问题似乎离题,请随意填写评论或编辑,因为这对我来说是一个真正的问题,我希望从已经从事过类似应用程序的人那里得到一些答案。
PPS 为了避免一些混淆,现代版本的Ada具有 OOP 特性,并且封装也可以简单地在C中实现。
c++ - 安全关键软件的 C++ 形式化方法
看看 C,C 对可以在代码中使用的形式化方法有很好的支持(frama-c、VCC、verifast)。据我所知,C++ 似乎没有任何可比性。
有哪些形式化方法可用于推理用 C++ 编写的安全关键软件?
java - 在不更改 dll 的情况下限制 JNA 调用的资源利用率
如何防止 JNA 方法调用超出 CPU 利用率、线程数和内存限制的阈值?
背景:
我正在开发一个安全关键应用程序,其中一个非安全关键功能需要使用用 C 编写的库。这些 dll 已作为黑盒提供给我,我不可能得到访问 java 接口文件之外的源代码。有没有办法限制 JNA 代码使用的 CPU 使用率、线程数和内存?
c++ - C++ 运算符重载错误检查无异常
我有一个类似的类vector
,主要是一个动态大小的数组。我正在为资源有限的平台编写它,因此我需要不使用异常。
很明显,要使用运算符重载来简化此类动态分配的接口,必须在某些运算符重载函数中执行。赋值运算符 (=) 就是一个示例。
尽管如此,以一种合理的方式通知调用者一个错误的分配错误,同时仍然保持强大的错误安全性,这变得相当具有挑战性。我可能有一个类的错误属性,调用者必须在每次涉及动态分配的调用后检查它,但这似乎不是一个最佳解决方案。
编辑:
这是我目前得到的最好的想法(在上面的段落中突出显示为一个不太理想的解决方案),任何改进将不胜感激:
然后调用:
我还没有编译这个,所以可能有错别字,但希望你能明白。
c - 发生错误时安全退出到特定状态
在编写代码时,我经常检查是否发生错误。一个例子是:
我过去也用过strerror( errno )
。
我只写过小型桌面应用程序exit()
,如果出现错误,程序是否编辑并不重要。
但是,现在我正在为嵌入式系统 (Arduino) 编写 C 代码,并且我不希望系统在出现错误时退出。我希望它进入一个特定的状态/功能,它可以关闭系统、发送错误报告和安全地空闲。
我可以简单地调用一个error_handler()
函数,但我可能在堆栈中很深并且内存非常低,导致error_handler()
无法操作。
相反,我希望执行能够有效地折叠堆栈,释放大量内存并开始整理掉电和错误报告。如果系统不能安全关闭电源,则存在严重的火灾风险。
是否有在低内存嵌入式系统中实现安全错误处理的标准方法?
编辑 1:我将限制我malloc()
在嵌入式系统中的使用。在这种特殊情况下,如果文件格式不正确,则在读取文件时会发生错误。
c - 使用函数指针方法进行状态机设计的三分之二投票
我正在开发一个需要我实施 2oo3 投票的安全系统。我大致有一个使用状态机使用函数指针来实现它的想法。假设有 3 个系统 AB C。关于 A,C 是左系统,B 是右系统 对于 B,A 是左系统,C 是右系统 对于 C,B 是左系统,C 是右系统系统
对于系统做出的每一个决定,它都应该使函数指针指向“与左系统交换数据”函数。数据发送到左系统后,它将指向一个虚拟函数并等待左系统回复。
当左系统回复并且它的决定(左系统)也同意系统(我的系统)做出的决定时,它将进入下一个状态。如果不同意,则应重复“与正确的系统交换数据”并继续。
我的疑问是因为我不想使用标志来实现状态转换控制,使用函数指针的实现是否可以,因为 MISRA 2004 以后没有说不使用函数指针?
上述 2oo3 实现的方法是否可行,或者还有其他需要注意的事项吗?
是否有任何其他方法来实现 2oo3 架构(每个系统做出的决定没有外部比较器。也就是说,每个 uC 应自己形成一个决定并与其他 2 协商它的决定。它不会将其决定放在外部比较器中(例如:共享内存、基于 fpga 的比较器等)供其他 2 个系统访问和比较)??
如果我错误地接近它,请原谅我。我是这个的新手。
(注:3 个系统只有微控制器)
更新:@Lundin 在这里添加了一些有用的点 -没有函数指针的状态机设计
c - 没有函数指针的状态机
我已经为安全 SIL 4 系统实现了具有大量状态转换的复杂状态机。这个实现的主干是使用函数指针完成的。当一切顺利时,V&V 反对在 SIL 4 系统中使用函数指针。参考规则 9 NASA .Misra C 2004 然而并没有说不能使用函数指针。
有没有其他方法可以在没有任何函数指针的情况下实现复杂的状态机?
embedded - CAN接受过滤
假设 CAN 网络中的所有节点都使用接受过滤器进行配置,以接收仅发送给它们的数据包。例如:节点 A 配置为接收仅在 11 位 id 字段中寻址到“A”的数据包,依此类推。
场景:如果有 4 个节点 A、B、C、D。
任务 1:如果 A 将数据包发送给 E(不是有效的 id)。是否会设置节点 A 的 ACK 标志以指示消息已被节点确认?即,如果消息未被接受过滤器接受,则发送者将不知道消息是否已被接收。
任务 2(取决于任务 1):如果 A 将数据包寻址到 D(有效 id)。确认消息表明只有D成功接收到消息?或者,这是否意味着所有节点都收到了消息,尽管他们的接受过滤器被配置为只接收他们的特定 ID?
原谅我,我在这里有点困惑:)
stack - 堆栈上的可执行 Ada 代码
我刚刚观看了去年32C3关于铁路系统安全注意事项的演讲。在第 25 分钟,演讲者简短地谈到了艾达。具体来说,他说:
典型的 Ada 实现有一种称为“(tramp / trunk / ?)lines”的机制。这意味着它将在 [the] 堆栈上执行代码,这对 C 程序来说不是很好。[...] 如果您想将 Ada 代码与 C 库链接,其中一种安全机制将不起作用。
这是演讲的各个部分的链接(YouTube)。这是背景中的幻灯片。如您所见,我不确定其中一个词。也许是蹦床?
现在我直截了当地问:这句话有道理吗?如果是这样,任何人都可以详细说明 Ada 语言的这个神秘特性及其明显影响的安全机制吗?
到目前为止,我一直认为代码位于代码段(也称为“文本”)中,而数据(包括堆栈)则位于不同内存位置的数据段中(如图所示)。在 Ada 中阅读有关内存管理的内容表明它应该不会有太大的不同。
虽然有一些方法可以规避这样的布局(参见例如这个“ C on stack ”问题和这个“ C on heap ”答案),但我相信现代操作系统通常会通过可执行空间保护来阻止这种尝试,除非堆栈被明确设为可执行。- 但是,对于嵌入式系统,如果代码没有保存在 ROM 上,它可能仍然是一个问题(有人可以澄清吗?)。
ada - 从不使用预定义的真实类型?
我开始通过阅读ADA Distilled来学习 Ada 语言。在第 3.8 章中它说:
Ada 程序员从不将预定义的真实类型用于安全关键的生产质量软件。
我想知道这到底意味着什么,我应该怎么做而不是使用预定义的真实类型。这是否意味着我不能使用整数?