Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 语义冲突将指针传递到常量指针到字节数组_C++_Const Cast - Fatal编程技术网

C++ 语义冲突将指针传递到常量指针到字节数组

C++ 语义冲突将指针传递到常量指针到字节数组,c++,const-cast,C++,Const Cast,我想从使用以下协议定义的OpenSSL库调用此函数: X509 *d2i_X509(X509 **px, const unsigned char **in, int len); 中的第二个参数被定义为常量无符号字符**,因为: d2i_X509不会修改中的*指向的缓冲区中的数据 中的*将按从缓冲区解析的数据量递增 现在这个原型是一个问题,因为据我所知,函数不能用下面的方式调用,据我所知,API是调用它的正常方式(删除错误管理代码以使事情更简单): 如果我试着编译上面的代码,它会说: err

我想从使用以下协议定义的OpenSSL库调用此函数:

X509 *d2i_X509(X509 **px, const unsigned char **in, int len);
中的第二个参数
被定义为
常量无符号字符**
,因为:

  • d2i_X509不会修改中的
    *指向的缓冲区中的数据
中的
*将按从缓冲区解析的数据量递增

现在这个原型是一个问题,因为据我所知,函数不能用下面的方式调用,据我所知,API是调用它的正常方式(删除错误管理代码以使事情更简单):

如果我试着编译上面的代码,它会说:

error: invalid conversion from 'unsigned char**' to 'const unsigned char**'
我理解消息的基本原理(例如已解释),但在这种特殊情况下,此基本原理不适用于函数在其文档中的状态,它只会增加
中的
*值,而不会向其分配不相关的指针

我无法将p的类型更改为
const unsigned char*
,因为上面的代码实际上是简化的,指针隐藏在执行读写操作的抽象IO对象后面。前一个IO对象的优点是将对称的读写代码保持在一起,可以在我的IO对象中使用两个单独的指针进行读写,但这样做的总体好处非常小(如果不是负的话),并且增加了很多语法噪音。在IO对象中,由于外部不相关的API调用而强制进行这种深刻的内部更改,看起来真的很牵强

一个解决方案可能是执行强制转换,甚至根本不使用返回的指针值(因为我有size参数),但感觉也不对。d2i_X509的原型似乎没有包含足够的信息,或者编译器的常量检查规则在这种情况下过于严格


如何从C++调用这样的API?现在我只想使用一个演员阵容,因为我觉得这是一个较小的邪恶,但是有没有更好的方法呢?

首先,这段代码中的
+=
没有多大意义:

p += read(fd, p, 2048);
您正在修改
p
以指向刚刚读取的数据,因此
d2i_x509
将读取垃圾数据

我会这样做:

unsigned char buffer[2048];
int n = read(fd, buffer, 2048);
if (n < 0) ..error..;
const unsigned char * p = buffer;
X509 * cert1 = d2i_x509(NULL, &p, certlen1);
X509 * cert2 = d2i_x509(NULL, &p, certlen2);
int used = p - buffer;  // # of bytes actually parsed by the two calls
为此:

{
  const unsigned char *q = p;
  X509 * cert1 = d2i_x509(NULL, &q, certlen1);
  p += q - p;
}

您在技术上是正确的,但完全不符合要点,虽然过度简化了我的实际代码,但我做得有点过头了。实际上,我有第二个指针“end”,它通过读取递增,certlen1和certlen2使用从缓冲区开始的p进行解析和提取,并在过程中递增。此外,p存储在一些不透明对象中,这些对象在缓冲区和(检查边界)上执行读写操作。然而,在没有明确收益的情况下,可能产生的内部成本是一个真正的负担。换句话说,如果是玩具,而不是真正的程序,建议的方案是可能的。我不确定它是否比演员更好(看起来像是某种破坏常量检查系统的方式),但是的,这绝对是避免演员的可能解决方案。
X509 * cert1 = d2i_x509(NULL, &p, certlen1);
{
  const unsigned char *q = p;
  X509 * cert1 = d2i_x509(NULL, &q, certlen1);
  p += q - p;
}