Двойная бесплатная ошибка с AddressSanitizer GCC 4.8

Рассмотрим следующую игрушечную программу (prog.cpp):

class A {
public:
vector<int> vec;
A() noexcept {}
A(vector<int> s) : vec(s) {}
};

class B {

private:
vector<atomic<A>> a_table;

public:
B(int capacity) : a_table(capacity) {}

void update(int index) {
A newValue(vector<int>(10,1));
a_table[index].store(newValue);
}
};int main(int argc, char** argv)
{
B b(5);
b.update(2);
return 0;
}

Это когда компилируется нормально (g++ prog.cpp -latomic), работает отлично. Но при компиляции как g++ -fsanitize=address -fno-omit-frame-pointer prog.cpp -latomic выдает ошибку Double Free при выполнении. Программа, основанная на тех же строках, что и выше, должна использоваться в многопоточном приложении, где даже обычная компиляция приводит к ошибке Double Free. Я прочитал Правило Три / Пять, которое обычно упоминается в случае Double Free, и различные другие документы, но ничего не работает.

Также удаление noexcept спецификатор из class AКонструктор по умолчанию выдает эту странную ошибку, о которой я также хотел бы знать.

error: function ‘std::atomic<_Tp>::atomic() [with _Tp = A]’ defaulted on its first declaration with an exception-specification that differs from the implicit declaration ‘std::atomic<A>::atomic()’
atomic() noexcept = default;
^

3

Решение

std::atomic требует тривиально копируемый тип, который ваш A нет, потому что его член типа vector<int> (например) не является тривиально копируемой конструкцией.

GCC обнаруживает нарушение этого требования только с версии 5.0.

Тот факт, что более старые версии gcc компилируют код, не означает, что он действителен.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]