复制CORBA :: Any包含字符串时,CORBA程序会出错

问题描述 投票:0回答:1

我正在研究使用CORBA的传统产品。我们希望支持omniiORB作为另一家供应商。我遇到了我们的一个测试seg faulting,我试图理解我们是否做错了,恰好与其他供应商合作,或者如果有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的情况下,是不是应该做一个深拷贝?我在这里错过了什么?

我有另一个简短的例子,如果这个例子被认为是不具代表性的,那么我们的遗留代码更接近于简单的IDL。

遗留代码所做的要点是复制使用any的属性,因此它可以是任何东西。我们在Visibroker或ACE + TAO过去没有遇到任何问题。

c++ corba omniorb
1个回答
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()并且这导致了seg错误。

© www.soinside.com 2019 - 2024. All rights reserved.