Сегменты программы CORBA при копировании CORBA :: Любой, содержащий строку - PullRequest
0 голосов
/ 20 марта 2019

Я работаю над устаревшим продуктом, который использует CORBA. Мы ищем поддержку omniiORB в качестве другого поставщика. Я столкнулся с одним из наших тестов с ошибкой сегмента, и я пытаюсь понять, что мы делали что-то не так, что случилось с другими поставщиками, или есть ошибка с omniiORB.

Я тестировал версию omniiORB, которая входит в Red Hat EPEL (4.2.0). Я также скачал и собрал последнюю версию 4.2.3 и все еще видел ошибку.

Ниже приведен тестовый пример, который, как мне кажется, демонстрирует поведение, которое я вижу в нашем коде.

#include <omniORB4/CORBA.h>
//#include "typedefs.hh"

#include <iostream>

// only happens with string types.
// primitive CORBA types and user-defined types don't cause the error

int main() {
  CORBA::Any any1;
  any1 <<= "Hello";

  CORBA::Any any2;
  any2 = any1;  // copy the any, seg fault in omniiorb
  // any2 <<= any1; // any inside any, also seg faults
  // CORBA::Any any2(any1); // copy constructor, also seg faults

  return 0;
}

Я знаю, что извлечение в сгенерированный умный указатель вызывает проблемы, поскольку any должно оставаться владельцем. Но в случае копирования Any, это не должно делать глубокую копию? Что мне здесь не хватает?

У меня есть еще один короткий пример, который ближе к тому, что делает наш унаследованный код, который включает простой IDL, если этот пример считается непредставительным.

Суть того, что делает унаследованный код, заключается в копировании свойств, использующих для значения значение any, поэтому оно может быть любым. В прошлом мы не видели никаких проблем с Visibroker или ACE + TAO.

1 Ответ

1 голос
/ 21 марта 2019

Проблема была на нашей стороне, потому что мы не инициализировали среду выполнения ORB с помощью CORBA :: ORB_init ().

Таким образом, пример, описанный в вопросе, неверен и должен быть:

#include <omniORB4/CORBA.h>
#include "typedefs.hh"

#include <iostream>

// only happens with string types.
// primitive CORBA types and user-defined types don't cause the error

int main(int argc, char*argv[]) {
  CORBA::ORB_var orb = CORBA::ORB_init(argc, argv, "omniORB4");

  CORBA::Any any1;
  any1 <<= "Hello";

  CORBA::Any any2;
  any2 = any1;

  return 0;
}

Большая часть нашего кода CORBA инициализирует среду выполнения ORB, но я столкнулся с тестовым модулем, который занимался переводом и копированием различных типов CORBA. Мы предполагали, что инициализация необходима только при выполнении сетевых вызовов, а не перед ЛЮБЫМИ вызовами, связанными с CORBA.

Тестовый код работал с Orbix, Visibroker и ACE + TAO, поскольку в этих реализациях это не имело значения. Это не удалось в omniiORB, потому что некоторые детали внутренней реализации набора кодов (и другие вещи) не инициализируются (они равны нулю) до вызова ORB_init (), и это вызвало ошибку seg.

...