使用chromium代码函数入参和出参传入同一个变量踩到的坑

背景:

开发一个需求的时候需要用到chromium中的加解密功能,但是发现加密之后解密失败了。

伪代码:

std::string text = "encryped-text";

bool b = Encryptor::Crypt(false, text, &text);

发现b的值为false。

备注:base::StringPiece 可以简单理解为 std::string_view,std::string可以隐式转成该类。

调试到了底层解密的代码到了这里,终于找到原因了:

在代码的139行可以看到函数的第一步就把出参output清理掉了。

而我的调用代码是使用了相同的变量作为该函数的入参和出参,所以调用到这里的时候,入参也同时被清空了,所以后面的代码都出错了导致解密失败。

stack overflow上也有人遇到了这个问题:

cvtColor assertion failed ( OpenCV with C++ ) - Stack Overflow

这个是输入输出参数传入相同变量的一些讨论:

c++ - Using the same variable as input/output in a function - Stack Overflow

解决:

std::string text = "encryped-text";

std::string result;

bool b = Encryptor::Crypt(false, text, &result);

使用一个单独的变量来传入即可。

最佳实践:

1、调用其他库的时候需要注意,是否支持入参出差传入相同变量

2、自己编写代码的时候尽量支持入参出差出入相同变量,也就是中间通过一个临时变量来辅助。

void Encrypt(const std::string& input, std::string& ouptut)
{
    std::string temp;
    // encrypt input to temp
    output.swap(temp);
}

实际上chromium的代码也是这么做的,但是他把 output清空了。