【发布时间】:2019-10-28 17:00:11
【问题描述】:
根据THIS page,很多 std::string 函数可以在 libstdc++ 实现中抛出异常。我无法更改 libstdc++ 的实现,而且切换到其他库的成本太高。我目前的目标是使大量使用 std::string 的代码符合 SEI CERT C++ 编码标准。我的问题是:
- 如何解决此问题以使 libstdc++ 不会跨越执行边界?
- 我认为无论我切换到哪个标准库实现,我最终都可能会遇到这个问题,因为从库中抛出异常是一种常见且可以说是合理的做法。那是否意味着我将永远面临这样的问题?是在实践中如此微不足道,以至于人们并不真正关心,还是人们使用异常来处理错误只是一种权衡?
谢谢!
【问题讨论】:
-
“执行边界”可能是上述编码标准中的一个术语,但它并不是在 C++ 上下文中经常使用的术语。我想到了另外两件事:是的,在正常情况下你不能逃避异常,同时仍然编写惯用的 C++。但是,如果中止是可以接受的,您可能能够重建一个标准库来执行此操作而不是抛出。我似乎记得至少 STLport 曾经有过这样的选择。
-
“执行边界”是什么意思?如果您的意思是 ABI 边界,那么让异常跨越 ABI 边界可能是未定义的行为(可能是实现定义的 - 检查您的工具链文档)。
-
@RichardCritten:不,不是。有很多支持异常的 ABI,例如适用于 C++ 的 Itanium ABI。
-
@MSalters 那么异常没有跨越 ABI 边界。
-
@RichardCritten:那么,我没有发现您的“ABI 边界”比问题中的“执行边界”更能提供信息。