【问题标题】:Crash proof regex?防撞正则表达式?
【发布时间】:2012-12-05 08:48:55
【问题描述】:

我一直在几个服务器中使用标准的 UNIX 版本的正则表达式,这些服务器必须对错误具有很强的弹性。多年来,我发现了几种情况,其中要么是用户输入了格式错误的正则表达式,要么是目标字符串中的一些奇怪字符导致了分段违规等,从而导致服务器崩溃。对于我们的系统来说,这是不可接受的。

在这些格式错误的模式或匹配字符串中是否有一个版本的正则表达式只会导致错误而不会使服务器崩溃?

由于在检查这些模式时这段代码主要是多线程的,所以我不想使用 setjmp longjmp 等。

【问题讨论】:

  • malformed regex - 编译正则表达式并检查异常some weird characters in the string - 你如何清理输入?服务器如何“崩溃”?是软件吗?还是整个操作系统?
  • 我猜你可以期待 std::basic_regex 和相关的非常强大。
  • @Angew:如果用户输入^(x*x*)*$ 作为他的正则表达式并让它在xxxxxxxxxxxxxxxxxxxxxxy 上松开,则不会。
  • @DavidAllanFinch 没问题 :)
  • @DavidAllanFinch:它将最终返回。可能是几百年后:P 如果服务器进程崩溃 - 检查它是否是由 1)未处理的异常 2)需要很长时间才能返回的正则表达式

标签: c++ c regex crash


【解决方案1】:

Google 最初为 Go 语言开发了 C++ 正则表达式库 RE2,但现在已经为 Perl、Python 等大多数脚本语言提供了包装器,它声称:

RE2 使用自动机理论来保证正则表达式搜索 与输入的大小成线性时间运行。 RE2 实现内存 限制,因此可以将搜索限制在固定数量的 记忆。 RE2 设计为使用较小的固定 C++ 堆栈占用空间 不管它必须处理什么输入或正则表达式;因此 RE2 是 在线程堆栈无法增长的多线程环境中很有用 任意大。

所以,似乎可以选择任何三个:快速、可靠、小型。

【讨论】:

    猜你喜欢
    • 2015-01-14
    • 2011-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多