小编mor*_*ido的帖子

确定Ravenscar程序中堆栈使用情况的最佳实践

我正在使用Ravenscar子集编写Ada程序(因此,我知道执行时运行任务的数量).代码由gcc编译并-fstack-check启用了开关.如果我的任何任务超过其堆栈,这应该导致程序在运行时引发STORAGE_ERROR.

Ada允许在相应任务的规范期间设置那些(任务特定的)堆栈的上限,如下所示:

pragma Storage_Size (Some_Value);
Run Code Online (Sandbox Code Playgroud)

现在我想知道我必须确定哪些选项Some_Value.到目前为止我所听到的:

  1. 做疯狂的猜测,直到没有STORAGE_ERROR被提出为止.这或多或少是OP 在此提出的建议.
  2. 输出-fstack-usage那里的输出.
  3. 使用此处概述的一些特定于gnat的扩展(这在技术上与第2项有何不同?).
  4. 得到像gnatstack这样的堆栈分析器,让它为你完成工作.

如果我理解这一点,所有上述技术都是动态的(即它们需要程序运行才能工作).静态方法是否也可以想象?例如,通过Ada的一些高完整性选项进一步限制自己(例如No_Recursion,还有什么?).

也许你们中的任何人都可以列举一些最佳实践来解决这个问题和/或扩展/评论我的(肯定是不完整的)列表.

额外问题:未指定上述编译指示时,任务堆栈的默认大小是多少?GCC的文档仅说明这个值取决于运行时,而不给出任何具体的数字.

memory gcc ada

6
推荐指数
1
解决办法
149
查看次数

堆栈上的可执行Ada代码

我刚刚从去年的32C3开始就铁路系统的安全考虑进行了讨论.在第25分钟,演讲者简要介绍了阿达.他具体说:

典型的Ada实现具有称为"(tramp/trunk /?)行"的机制.这意味着它将在[堆栈]上执行代码,这对C程序来说并不是很好.[...]如果您想将Ada代码与C库链接,其中一种安全机制将无法正常工作.

以下是对话题各部分的链接(YouTube).是背景中的幻灯片.如你所见,我不确定其中一个词.也许是蹦床


现在我的直言不讳的问题:这句话中有没有真相?如果是这样,任何人都可以详细说明Ada语言的神秘特征及其明显影响的安全机制吗?

直到现在我总是假设代码生活在一个代码段(也称为"文本"),而数据(包括堆栈)被放置在一个数据段在不同的存储位置(如所描绘这个图形).在Ada中阅读关于内存管理的建议表明它应该没有太大的不同.

虽然有办法绕过这样的布局(参见例如" C on stack "问题和这个" C on heap "答案),但我相信现代操作系统通常会通过可执行空间保护来阻止此类尝试,除非显式地使堆栈可执行. - 但是,对于嵌入式系统,如果代码没有保存在ROM上,那么它可能仍然是一个问题(任何人都可以澄清吗?).

stack ada scada safety-critical data-segment

4
推荐指数
1
解决办法
1113
查看次数

Java在Apache POI上进行搜索和替换时如何避免覆盖模板文件

我正在使用 Apache POI 3.13 并试图从给定的模板文件中搜索和替换文本,然后保存新生成的 .docx。这是我的代码:

public static void main(String[] args) throws InvalidFormatException, IOException {
    String filePath = "Sample.docx";
    File outputfile = new File("SampleProcessed.docx");

    XWPFDocument doc = new XWPFDocument(OPCPackage.open(filePath));

    for (XWPFParagraph p : doc.getParagraphs()) {
        List<XWPFRun> runs = p.getRuns();
        if (runs != null) {
            for (XWPFRun r : runs) {
                String text = r.getText(0);
                if (text != null && text.contains("$VAR")) {
                    text = text.replace("$VAR", "JohnDoe");
                    r.setText(text, 0);
                }
            }
        }
    }

    doc.write(new FileOutputStream(outputfile));
    doc.close();
    System.out.println("Done");
    Desktop.getDesktop().open(outputfile);
}
Run Code Online (Sandbox Code Playgroud)

这看起来很简单,但是当我运行这段代码时,文档“Sample.docx”也被替换了。最后,我有两个内容相同的文档。

这是 POI …

java apache-poi xwpf

3
推荐指数
1
解决办法
1105
查看次数

标签 统计

ada ×2

apache-poi ×1

data-segment ×1

gcc ×1

java ×1

memory ×1

safety-critical ×1

scada ×1

stack ×1

xwpf ×1