g ++ std :: chrono подтверждение - PullRequest
0 голосов
/ 20 февраля 2019

У меня проблемы с некоторым кодом из проекта C ++.Он включает в себя библиотеку std::chrono и продолжает работать при следующем утверждении:

static_assert(system_clock::duration::min() < system_clock::duration::zero(), "a clock's minimum duration cannot be less than its epoch");

Assert разбивает код как на компьютере Debian с g ++ 6.3.0, так и на ПК с Windows 10, CygWin и g ++7.3.0.Я также попробовал в онлайн-компиляторе C ++ простой пример, включающий библиотеку chrono, которая сама по себе не создает никаких проблем, но при сравнении вручную минимальная и нулевая длительность системных часов chrono дает результат, который должен вызвать утверждение какну.

Я искал проблему и нашел некоторые подсказки, приводящие к некоторым связанным проблемам, вызванным переменной posix TZ, которая содержит информацию о часовом поясе.Попытался сбросить и установить его на правильное значение, но это не оказало влияния на assert.

Я был бы признателен за любые указатели или предложения.

Редактировать: Хотя стандарт:: chrono :: milliseconds :: zero () имеет (как и ожидалось) значение 0, значение std :: chrono :: milliseconds :: min () равно -9223372036854775808 или -2 ^ 63, которое я считаюминимально возможное значение для длинного длинного значения (возможное переполнение?).

Ответы [ 3 ]

0 голосов
/ 20 февраля 2019

Длительность может быть отрицательной, как вы обнаружили с очень отрицательным значением… :: min ().Утверждение неверно, почти как утверждение о том, что -1 должно быть больше нуля.

Спецификация C ++ 17 объявляет функцию abs() для нахождения абсолютной продолжительности и обсуждает ее применимость с представлением со знаком и без знака.:

23.17.5.9 алгоритмы длительности [time.duration.alg]

template <class Rep, class Period> constexpr duration<Rep, Period> abs(duration<Rep, Period> d);

1 Примечания: Эта функция не должна участвовать в разрешении перегрузки, если только numeric_limits :: is_signed имеет значение true.

2 Возвращает: если d> = d.zero (), вернуть d, в противном случае вернуть -d.

0 голосов
/ 20 февраля 2019

После некоторых тестов я понял, что assert запускается в обеих системах только при использовании g ++ через используемое тестирующее программное обеспечение, так как один и тот же код, скомпилированный вне его, не подведет утверждение с теми же компиляторами.

Оказывается, что программное обеспечение использует EDG-парсер , и ему требуется опция - 64_bit_target , чтобы избежать запуска утверждения.К сожалению, в документации парсера нет информации об этой опции, поэтому я не могу знать причину, по которой эта проблема возникает без нее.

Возможно, вопрос сейчас не имеет большого значения, но я этого не сделалхотите удалить его, так как люди уже написали ответы, которые могут быть кому-то интересны.

0 голосов
/ 20 февраля 2019

У меня может быть два предложения:

  1. В общем, сбой подтверждения возможен только в отладочной версии, поэтому, если вы просто хотите собрать успешно, вы можете собрать версию для выпуска, чтобы избежать проблемы.
  2. Вы можете подтвердить часовой пояс Debian и Windows в соответствующей зоне.
...