复制包含字符串的CORBA :: Any时,CORBA程序seg错误

时间:2019-03-20 04:05:59

标签: c++ corba omniorb

我正在研究使用CORBA的旧产品。我们希望支持omniiORB作为其他供应商。我遇到了一个测试段错误,并且试图了解我们是否在做与其他供应商一起使用的错误操作,或者omniiORB是否存在错误。

我使用Red Hat EPEL(4.2.0)中的omniiORB版本进行了测试。 我还下载并构建了最新版本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 个答案:

答案 0 :(得分:1)

问题就在我们这边,这是因为我们没有通过CORBA :: ORB_init()初始化ORB运行时。

因此问题中描述的示例无效,应该为:

#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()之前,没有初始化本机代码集内部实现的详细信息(以及其他内容)(它们为null),这导致了seg错误。