2016-11-30 2 views
1

Ранее сегодня я споткнулся addition on std::atomic<double> not adding up to non-atomic counterpart, которые оказались бы из-за std::atomic<double> Оставшись неинициализированным (см также What's the default value for a std::atomic?). Однако мое внимание привлекло то, что мой компилятор не предупредил меня о том, что std::atomic<double> не был инициализирован. Рассмотрим:Нет компилятор предупреждения для неинициализированного станда :: атомного <double>

#include <iostream> 
#include <atomic> 

int main() 
{ 
    std::atomic<double> d; 
    double e; 

    std::cout << d << " " << e << std::endl; 
} 

Ни лязг 3,8, ни GCC 6.2, как представляется, в состоянии произвести предупреждение для d быть неинициализированным. См. live at coliru: Я использовал -Wall -pedantic -Wextra, но не получил предупреждения как с -O2, так и без него. Разумеется, обычно создается предупреждение о том, что e не инициализируется. (Интересно, что НКУ фактически не производит какого-либо предупреждения, когда -O2 включена.)

Конечно, я не можно ожидать компилятор, чтобы предупредить меня об этих вещах; но этот случай оставил мне интересно:

  • Есть ли особая причина, почему эта ситуация не обнаружена/не указана соответствующими компиляторами?
  • ... или даже (я бы предположил, что это маловероятно): невозможно ли по какой-либо причине обнаружить/сообщить о пропавшей инициализации в конкретном случае std::atomic<T>, где T не имеет конструктора по умолчанию?
  • или, может быть, есть еще один ключ командной строки, который я пропускаю, что заставит компилятор выдать предупреждение?

ответ

0

Почему: К сожалению, мы не знаем. Возможно, никто, кто вносит свой вклад в разработку gcc, не хотел этого делать или думал, что это того стоит.

Невозможно обнаружить? По-моему, это не технически. Но это должен быть особый случай, иначе вы бы представили множество предупреждений для нередкого случая объявления vars структур и типов классов без явно определенных конструкторов по умолчанию без списков инициализации или чего-то еще.

Стоит ли добавить специальный чехол? Наверное, но это вопрос мнения и убеждение кого-то реализовать его в gcc.

Коммутаторы командной строки? Не совсем, хотя -Weffc++ может вам что-то сделать. Я не пробовал. Вы также можете попробовать запустить его через valgrind, возможно, что сообщит что-то. И не пробовали.

+0

Спасибо. Я попробовал '-WeffC++', к сожалению, в этом случае не имеет значения. – mindriot

Смежные вопросы