std :: function, Clang 6.0 & MSVC (10.0017134.12) - возможная ошибка ABI или требуемые флаги компилятора - PullRequest
0 голосов
/ 17 мая 2018

Если я создаю простую библиотеку (созданную с использованием CMake):

foo.h

#pragma once

#include <functional>

void foo(std::function<void()> handler);

foo.cpp

#include "foo.h"

void foo(std::function<void()> handler)
{
    handler();
}

И затем создайте отдельный проект CMake, компилирующий исполняемый файл:

#include "foo.h"
#include <cstdlib>
#include <iostream>

int main()
{
    foo([&]()
    {
        std::cout << "hello" << std::endl;
    });

    return EXIT_SUCCESS;
}

И затем скомпилируйте библиотеку, используя MSVC (используя последний SDK платформы 10.0.17134.12) в Release или RelWithDebInfo (помните, яя использую CMake), и я компилирую исполняемый файл с использованием Clang 6 (Clang 5 не поддерживается с последней версией Windows Platform SDK, поставляемой в комплекте с Visual Studio 17.7 https://blogs.msdn.microsoft.com/vcblog/2018/05/07/announcing-msvc-conforms-to-the-c-standard/), также использующей Release или RelWithDebInfo, затем я получаю повреждение кучи, вызванноеstd::function деструктор.

Чтобы надежно вызвать повреждение кучи, я могу использовать gflags.

    gflags -p /enable "myexe.exe" /full

Он отлично работал с Clang 5 на предыдущей платформе SDK (стандартный Clang доступен для скачиванияот LLVM, а не от версии Microsoft.) Я предполагаю, что это проблема или ошибка ABI (или аналогичная). Потребовалось некоторое время, чтобы разобрать все это и получить минимально проверяемое воспроизведение. У кого-нибудь естьny предложения о том, где его взять отсюда?

1 Ответ

0 голосов
/ 11 декабря 2018

Судя по всему, это проблема ABI, поэтому я сообщил об ошибке:

https://bugs.llvm.org/show_bug.cgi?id=39962

Обновление:

Ошибка была исправлена ​​в https://reviews.llvm.org/rL328386 и включена в Clang 7.0.0.

...