我使用函数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
.