使用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 tempoutput.swap(temp);
}

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/416040.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[ELK] ELK企业级日志分析系统

一、ELK 概述 1.1 ELK 简介与组件 ELK平台是一套完整的日志集中处理解决方案,将 ElasticSearch、Logstash 和 Kiabana 三个开源工具配合使用, 完成更强大的用户对日志的查询、排序、统计需求。 ●ElasticSearch:是基于Lucene(一个…

Sentinel 轨道数据及下载

Sentinel卫星轨道文件在处理Sentinel卫星数据时发挥着关键作用。这些轨道文件包含了有关卫星在轨道上的运动、位置、姿态等信息,对于地理校正、成像几何校正以及多时相分析等方面具有重要作用。以下是Sentinel卫星轨道文件的主要作用: 地理校正&#xff…

File 类的用法和 InputStream, OutputStream 的用法

1.File类的用法 下面就用几个简单的代码案例来熟悉File类里面函数的用法: public class IODemo1 {public static void main(String[] args) throws IOException {File f new File("./test2.txt");//File f new File("C:/User/1/test.txt");S…

1月下半笔记(个人向)

最近才开始看d2l(这种东西早该在两年前看的,拖到现在了) 为了做项目还得学一手OpenGL(被windows安装GLFW逼疯了) 1.15 打完ICPC EC final回来,也许可以出一篇博客写下简单的题解。 对蛋白质相似空间子结…

23款奔驰C260L升级香氛负离子 车载香薰

奔驰原厂香氛系统激活原车自带系统,将香气加藏储物盒中,通过系统调节与出风口相结合,再将香味传达至整个车厢,达到净化车厢空气的效果,让整个车厢更加绿色健康,清新淡雅。 星骏汇小许Xjh15863 产品功能&a…

爱普生L3150新更换废墨垫还是不能使用,如何对它进行废墨清零操作

环境: 爱普生L3150 Win10 专业版 废墨清零软件Resetter 问题描述: 爱普生L3150新更换废墨垫还是不能使用,如何对它进行废墨清零操作 打印机右后方更换了全新的废墨垫,还是告警闪灯用不了,需要进行废墨清零操作 解…

【数据结构二】链表和LinkedList详解

目录 链表和LinkedList 1.链表的实现 2.LinkedList的使用 3.ArrayList和LinkedList的区别 4.链表OJ题训练 链表和LinkedList 当 在 ArrayList 任意位置插入或者删除元素时,就需要将后序元素整体往前或者往后 搬移,时间复杂度为 O(n) ,效率…

软件测试|sqlalchemy一对一关系详解

简介 SQLAlchemy 是一个强大的 Python ORM(对象关系映射)库,它允许我们将数据库表映射到 Python 对象,并提供了丰富的关系模型来处理不同类型的关系,包括一对一关系。在本文中,我们将深入探讨 SQLAlchemy …

【Linux 命令】tree 对目录进行树形展示

目录 1、tree 命令功能展示 2、tree 命令安装 3、tree 命令语法及其参数功能 4、终止 tree 展开树命令 1、tree 命令功能展示 在 Linux 中,我们使用 ll 命令对目录的展示并不太方便我们查看,不太清晰明了,所以我们可以使用 tree 命令以…

JavaScript的代码执行顺序

(1). js的执行顺序,先同步后异步 (2). 异步中任务队列的执行顺序: 先微任务microtask队列,再宏任务macrotask队列 注意,按顺序从上到下时,没有轮到执行的任务会进入相应…

Spring Boot Aop 执行顺序

Spring Boot Aop 执行顺序 1. 概述 在 spring boot 项目中,使用 aop 增强,不仅可以很优雅地扩展功能,还可以让一写多用,避免写重复代码,例如:记录接口耗时,记录接口日志,接口权限&…

LeetCode、162. 寻找峰值【中等,最大值、二分】

文章目录 前言LeetCode、162. 寻找峰值【中等,最大值、二分】题目及类型思路及代码思路1:二分思路2:寻找最大值 资料获取 前言 博主介绍:✌目前全网粉丝2W,csdn博客专家、Java领域优质创作者,博客之星、阿…