当无效字符串作为参数传递时,如何确保 posix_time_zone 构造函数不会崩溃

Posted

技术标签:

【中文标题】当无效字符串作为参数传递时,如何确保 posix_time_zone 构造函数不会崩溃【英文标题】:how to make sure that posix_time_zone constructor won't crash when invalid string is passed as argument 【发布时间】:2016-04-04 19:46:15 【问题描述】:

我正在尝试在我们的项目中使用 posix_time_zone,如下所示。

time_zone_ptr zone(new posix_time_zone(localTimeZone.c_str()));
const string hasDST = zone->has_dst() ? "true" : "false";
const int Year = second_clock::local_time().date().year();
const string stTime = to_iso_extended_string(zone->dst_local_start_time(Year));
const string endTime = to_iso_extended_string(zone->dst_local_end_time(Year));

localTimeZone 将由项目中的另一个应用程序设置。我需要使用该值通过 posix_time_zone 获取 dst 相关参数。我无法控制另一个应用程序设置的值,我遇到了以下崩溃。

(gdb) bt
#0  0xb5a7f8a6 in ?? () from /lib/libc.so.6
#1  0xb5a8dcde in raise () from /lib/libc.so.6
#2  0xb5a905b6 in abort () from /lib/libc.so.6
#3  0xb5c3e1e6 in __gnu_cxx::__verbose_terminate_handler () at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/vterminate.cc:95
#4  0xb5c3ce60 in __cxxabiv1::__terminate (handler=<optimized out>) at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/eh_terminate.cc:38
#5  0xb5c3ce7c in std::terminate () at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/eh_terminate.cc:48
#6  0xb5c3d068 in __cxxabiv1::__cxa_throw (obj=0xb4f00a90, tinfo=0xb60a7e34 <typeinfo for boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> >>,
dest=0xb60665e1 <boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::bad_lexical_cast> >::~clone_impl()>) at ../../../../gcc-linaro-4.8-2014.11/libstdc++-v3/libsupc++/eh_throw.cc:87
#7  0xb6062dc0 in void boost::throw_exception<boost::bad_lexical_cast>(boost::bad_lexical_cast const&) () from /usr/local/lib/libmbtime.so
#8  0xb60631aa in boost::detail::lexical_cast_do_cast<int, std::string>::lexical_cast_impl(std::string const&) () from /usr/local/lib/libmbtime.so
#9  0xb605f3ea in int boost::lexical_cast<int, std::string>(std::string const&) () from /usr/local/lib/libmbtime.so
#10 0xb605b686 in boost::posix_time::time_duration boost::date_time::str_from_delimited_time_duration<boost::posix_time::time_duration, char>(std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&) ()

来自 /usr/local/lib/libmbtime.so #11 0xb605c80e in boost::local_time::posix_time_zone_base::calc_zone(std::string const&) () 来自 /usr/local/lib/libmbtime.so #12 0xb6059440 in boost::local_time::posix_time_zone_base::posix_time_zone_base(std::string const&) () 来自 /usr/local/lib/libmbtime.so #13 0xb6054e1e 在 PlatformTime::TimeZoneHandler(void*) () 来自 /usr/local/lib/libmbtime.so #14 0xb6f7d170 在?? () 来自 /lib/libpthread.so.0 回溯停止:前一帧与此帧相同(损坏的堆栈?) (gdb) 退出

这可能是因为 localTimeZone 有一些无效值(另一个问题是我正在使用 c 字符串,我需要更改 C++ 字符串)。任何人都可以提出任何建议如何测试 localTimeZone 是否具有正确的格式提升预期。

【问题讨论】:

time_zone_ptr 的构造函数周围捕获bad_lexical_cast 并发布结果。 【参考方案1】:

如果传递的值无效,boost::local_time::posix_time_zone 的构造函数将抛出 std::invalid_argumentstd::out_of_rangeboost::bad_lexical_cast(本例中的那个)。捕获这些异常(或捕获它们的共同父级std::exception),它就不会崩溃。

【讨论】:

感谢 StenSoft 列出它会抛出的所有异常。 必须抓住他们!! catch(std::exception const&amp; e)

以上是关于当无效字符串作为参数传递时,如何确保 posix_time_zone 构造函数不会崩溃的主要内容,如果未能解决你的问题,请参考以下文章

POSIX 消息队列 - 打开时出错:参数无效

装饰器仅在装饰方法时有效,但在使用作为参数传递的方法调用装饰器时无效

Symfony 4:如何将$ _SERVER数组作为构造函数参数传递

作为参数传递时如何评估函数

在辅助方法中将 self 作为参数传递

如何在python类中将方法名称作为参数传递