c++ - 复制包含字符串的 CORBA::Any 时 CORBA 程序段错误

标签 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 有任何问题。

最佳答案

问题出在我们这边,因为我们没有通过 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,因为在这些实现中它并不重要。它在 omniORB 中失败,因为一些 native 代码集内部实现细节(和其他东西)在调用 ORB_init() 之前未初始化(它们为空),这导致了段错误。

关于c++ - 复制包含字符串的 CORBA::Any 时 CORBA 程序段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55253441/

相关文章:

java - NameContext 中的死锁。列表 ()

vim - CORBA IDL 的 ctags 生成器?

C++:什么是类接口(interface)?

尝试解析 CORBA 引用时出现 C++ 段错误

c++ - 在C++ {fmt}中格式化琐碎结构的扩展计划?

erlang - Orber (Erlang ORB) 在 TAO orb 抛出时无法捕获用户定义的异常

c++ - omn​​iORB C++ 服务器,运行应用程序的 Java 客户端问题

windows - 如何在 Windows 上安装 omniORB?

c++ - 将 unsigned char 数组重铸为 unsigned long 数组

C++ 从 .txt 中读取浮点值并将它们放入一个未知大小的二维数组中