我正在使用Ravenscar子集编写Ada程序(因此,我知道执行时运行任务的数量).代码由gcc编译并-fstack-check启用了开关.如果我的任何任务超过其堆栈,这应该导致程序在运行时引发STORAGE_ERROR.
Ada允许在相应任务的规范期间设置那些(任务特定的)堆栈的上限,如下所示:
pragma Storage_Size (Some_Value);
Run Code Online (Sandbox Code Playgroud)
现在我想知道我必须确定哪些选项Some_Value.到目前为止我所听到的:
-fstack-usage那里的输出.如果我理解这一点,所有上述技术都是动态的(即它们需要程序运行才能工作).静态方法是否也可以想象?例如,通过Ada的一些高完整性选项进一步限制自己(例如No_Recursion,还有什么?).
也许你们中的任何人都可以列举一些最佳实践来解决这个问题和/或扩展/评论我的(肯定是不完整的)列表.
额外问题:未指定上述编译指示时,任务堆栈的默认大小是多少?GCC的文档仅说明这个值取决于运行时,而不给出任何具体的数字.
我刚刚从去年的32C3开始就铁路系统的安全考虑进行了讨论.在第25分钟,演讲者简要介绍了阿达.他具体说:
典型的Ada实现具有称为"(tramp/trunk /?)行"的机制.这意味着它将在[堆栈]上执行代码,这对C程序来说并不是很好.[...]如果您想将Ada代码与C库链接,其中一种安全机制将无法正常工作.
以下是对话题各部分的链接(YouTube).这是背景中的幻灯片.如你所见,我不确定其中一个词.也许是蹦床?
现在我的直言不讳的问题:这句话中有没有真相?如果是这样,任何人都可以详细说明Ada语言的神秘特征及其明显影响的安全机制吗?
直到现在我总是假设代码生活在一个代码段(也称为"文本"),而数据(包括堆栈)被放置在一个数据段在不同的存储位置(如所描绘这个图形).在Ada中阅读关于内存管理的建议表明它应该没有太大的不同.
虽然有办法绕过这样的布局(参见例如" C on stack "问题和这个" C on heap "答案),但我相信现代操作系统通常会通过可执行空间保护来阻止此类尝试,除非显式地使堆栈可执行. - 但是,对于嵌入式系统,如果代码没有保存在ROM上,那么它可能仍然是一个问题(任何人都可以澄清吗?).
我正在使用 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 …