我正在研究使用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都没有出现任何问题。
答案 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错误。