Почему мой пустой необязательный параметр не пуст, когда я выделяю один байт в куче внутри структуры Microsoft CppUnitTeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Почему мой пустой необязательный параметр не пуст, когда я выделяю один байт в куче внутри структуры Microsoft CppUnitTe

Сообщение Anonymous »

Следующий тест подтверждает, что x имеет значение, хотя оно должно быть пустым:

Код: Выделить всё

#include 

#include 
#include 
#include 

using namespace Microsoft::VisualStudio::CppUnitTestFramework;

template
class MyTestClass : public TestClass {
void __Invoke(TestClassImpl::__voidFunc m) override {
// Remove b and the test passes!
auto b = new bool(true);  // or: switch value to false and it passes!
TestClass::__Invoke(m);
delete b;
}
};

class ActualTestClass : public MyTestClass {
TEST_METHOD(ActualTestMethod) {
for (auto x : std::initializer_list({std::nullopt})) {
Assert::IsFalse(x.has_value());
std::stacktrace::current();
}
}
};
Я использую класс MyTestClass, чтобы внедрить некоторые общие функции в TestClass из платформы Microsoft CppUnitTest — в моем случае это сторожевой таймер для отслеживания времени выполнения теста, единственная цель которого — записать что-то в журнал и завершить процесс в случае, если тест превышает некоторое время ожидания.
Это отлично работает. Но в некоторых случаях это приводит к повреждению x. Почему?
Дополнительная информация:
  • Это происходит только при создании сборки «Выпуск», а не для сборок «Отладка».
  • Это происходит независимо от подключенного отладчика.
  • Это происходит только при выделении кучи (

    Код: Выделить всё

    new bool
    , make_unique, ...), но не при выделении стека в одном и том же месте.
  • Мне не удалось еще больше сократить код. В частности, это должен быть цикл, он должен использовать std::initializer_list, он должен вызывать std::stacktrace::current() и т. д.
Наблюдения коллег немного отличаются: они сообщают, что
  • Это происходит только при подключенном отладчике, а не при «запуске» теста в обозревателе тестов Visual Studio.
  • Они могут удалить

    Код: Выделить всё

    std::stacktrace::current();
    
    и все равно может воспроизвести проблему.


Подробнее здесь: https://stackoverflow.com/questions/798 ... inside-mic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»