使用-ftrapv编译时,boost::posix_time::from_time_t崩溃



我使用函数ptime from_time_t(time_t t);并将t设置为像UINT_MAX这样的大值。当我使用-ftrapv选项-程序崩溃,因为发生签名溢出,没有选项-有时结果是不正确的(接近00:00,1970年1月1日)。我不想禁用-ftrapv选项。

问题:是boost bug还是from_time_t对参数有一些限制?

代码范例
#include <boost/date_time/posix_time/posix_time.hpp>
#include <climits>
#include <type_traits>
int main() {    
long int lmax{LONG_MAX};
unsigned int umax{UINT_MAX};

std::cout<<"Start = "<<lmax<<std::endl;
std::cout<<"std::is_same_v<time_t, long int> = "
<<std::is_same<time_t, long int>::value<<std::endl;
try {    
std::cout <<boost::posix_time::from_time_t(umax)<<std::endl;    
std::cout <<boost::posix_time::from_time_t(lmax)<<std::endl;    
}
catch(const std::exception& e)
{
std::cout<<"exception e = "<<e.what()<<std::endl;   
}
std::cout<<"Finish"<<std::endl;   
}

恐怕有未记录的"隐式";from_time_t的输入限制(前提条件):

输入导致有符号整数溢出:9223372036854775807 * 1000000不能在boost/date_time/time_resolution_traits.hpp:153:47 (boost 1.79)中以类型'long int'表示。

简而言之,如果您需要trapv,则应该避免使用无效参数调用from_time_t。您可以向库开发人员提出问题,指出缺乏文档。他们可能会回答"但这是实现/平台相关的",但如果你给他们你的用例,他们可能会被"可移植安全"的文档所强迫。time_t.

相关内容

最新更新