Boost.Interprocess: тестовый сценарий дает разные результаты, если он скомпилирован с оптимизацией или без нее (GCC) - PullRequest
3 голосов
/ 19 ноября 2011

У меня проблемы с распределителями Boost.Interprocess при компиляции с оптимизацией.Мне удалось получить это до 40 строк теста, большинство из которых являются шаблонными.Просто взгляните на функции create() и main() в приведенном ниже коде.

#include <iostream>
#include <boost/interprocess/allocators/allocator.hpp>
#include <boost/interprocess/managed_shared_memory.hpp>

namespace interp = boost::interprocess;

struct interp_memory_chunk
{
  interp::managed_shared_memory  chunk;

  interp_memory_chunk ()
  {
    interp::shared_memory_object::remove ("GCC_interprocess_test");
    chunk = interp::managed_shared_memory (interp::create_only, "GCC_interprocess_test", 0x10000);
  }

  ~interp_memory_chunk ()
  {
    interp::shared_memory_object::remove ("GCC_interprocess_test");
  }
};

typedef  interp::allocator <int, interp::managed_shared_memory::segment_manager>  allocator_type;

inline  void
create (allocator_type& allocator, allocator_type::value_type& at, int value)
{
  allocator.construct (allocator.address (at), value);
}

int
main ()
{
  interp_memory_chunk      memory;
  allocator_type           allocator (memory.chunk.get_segment_manager ());
  allocator_type::pointer  data = allocator.allocate (1);

  create (allocator, *data, 0xdeadbeef);
  std::cout << std::hex << *data << "\n";
}

При компиляции без оптимизации :

g++ interprocess.cpp -lboost_thread -o interprocess

и выполнениивыходное значение равно deadbeef, как и ожидалось.

Однако при компиляции с оптимизацией :

g++ -O1 interprocess.cpp -lboost_thread -o interprocess

running дает 0, not что ожидается.

Итак, я не уверен, где проблема.Это ошибка в моей программе, то есть я вызываю UB?Это ошибка в Boost.Interprocess?Или, может быть, в GCC?

Для записи, я наблюдаю это поведение с GCC 4.6 и 4.5, но не с GCC 4.4 или Clang.Ускоренная версия - 1.46.1.

РЕДАКТИРОВАТЬ: Обратите внимание, что наличие create() в качестве отдельной функции является существенным, что может указывать на то, что проблема возникает, когда GCC вставляет ее.

1 Ответ

0 голосов
/ 06 февраля 2012

Как и предполагали другие, одно из решений - попытаться найти минимальный набор флагов оптимизации, который необходим для запуска вашей проблемы, используя -O1 -fno ....

Другие параметры:

  1. Используйте Valgrind и посмотрите, что получится

  2. Попробуйте скомпилировать с "-fdump-tree-all", это создаст кучу промежуточных скомпилированных файлов.Затем вы можете увидеть, есть ли различия в скомпилированном коде.Эти промежуточные файлы все еще находятся в C ++, поэтому вам не нужно знать ассемблер.Они в значительной степени удобочитаемы для человека и, безусловно, доступны для понимания.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...