背景:
开发一个需求的时候需要用到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清空了。