10.5. Ada

在 Ada95 中,Unbounded_String 类型通常比 String 类型更灵活,因为它会根据需要自动调整大小。但是,不要在 Unbounded_String 中存储特别敏感的秘密值,例如密码或密钥,因为核心转储和页面区域可能仍然会在之后保留它们。相反,对于此类数据,请使用 String 类型,在使用时将其锁定在内存中,并尽快用一些常量值(例如 (others => ' '))覆盖数据。在擦除内存后,在保存秘密的对象上使用 Ada pragma Inspection_Point。这样,您可以确定包含秘密的对象确实会被擦除(并且覆盖不会被优化掉)。

对于 Ada 初学者来说,通常会认为 String 类型的第一个索引值始终为 1,但如果字符串被切片,则情况并非如此。避免此错误。

值得注意的是,SPARK 是 “Ada 编程语言的一个高完整性子集”;SPARK 用户使用一个名为 “SPARK Examiner” 的工具来检查是否符合 SPARK 规则,包括流分析,并且如果需要,还提供各种支持以进行完整的代码形式化证明。 请访问 SPARK 网站了解更多信息。据我所知,没有 OSS/FS SPARK 工具。如果您要存储密码和私钥,您仍然应该在适当的情况下将它们锁定到内存中,并尽快覆盖它们。请注意,SPARK 通常用于不发生分页的环境中。