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

Posted

技术标签:

【中文标题】复制包含字符串的 CORBA::Any 时 CORBA 程序段错误【英文标题】:CORBA program seg faults when copying CORBA::Any containing a string 【发布时间】:2019-03-20 04:05:58 【问题描述】:

我正在开发使用 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】:

问题出在我们这边,因为我们没有通过 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 错误。

【讨论】:

以上是关于复制包含字符串的 CORBA::Any 时 CORBA 程序段错误的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2010:调试时,如何从变量中复制包含回车符的字符串值?

R使用笔记:相关系数:cor.test();corr.test();rcorr()

触发 API 网关端点时 COR 配置错误

Nginx在重定向时复制查询字符串

使用 URI 复制时不支持文件名中的特殊字符

为啥修饰符顺序在 SwiftUI 中很重要? [复制]