如何修改 std::cin 的内部缓冲区

Posted

技术标签:

【中文标题】如何修改 std::cin 的内部缓冲区【英文标题】:How do I modify the internal buffer of std::cin 【发布时间】:2010-12-23 14:14:53 【问题描述】:

我正在编写一个使用std::cin获取密码的软件

虽然不太可能,但我试图避免密码从内存分页到磁盘的可能性,所以我想修改std::cin 的缓冲区,以便在我完成后立即覆盖密码。

现在我有这个:

std::cin.clear();
std::stringstream ss;
ss << "0000000000000000000000000000000000000000000000";
std::cin.rdbuf(ss.rdbuf());
std::cin.clear();

但我很确定这很糟糕,因为它没有考虑 cin 缓冲区的当前大小。 如何正确覆盖缓冲区的内容?

感谢您的帮助!

【问题讨论】:

【参考方案1】:

即使您立即在缓冲区上乱涂乱画,密码仍有可能写入磁盘。系统 i/o 缓冲区可能会被分页到磁盘,std::cin 所在的工作内存也可能会被分页。我曾经开发过能够准确检测出这些情况的取证软件。

【讨论】:

但是覆盖缓冲区不会覆盖相同的内存区域吗? 难道不能告诉内核使某个对齐的页面不会因磁盘分页而变得难以辨认吗? @Jorge:关键是即使密码在内存中只存在一个指令周期,也有可能将其分页到磁盘。 @Vainstah:流缓冲区的程序副本甚至运行时库的副本都可以做到这一点,但是系统的 i/o 缓冲区呢?没有办法知道它们在哪里。 取证:1 开发人员:0 ::欢呼::【参考方案2】:

您可以使用gptr()egptr() 来获取缓冲区的开头和结尾。

编辑:正如 Charles Bailey 指出的,这些是受保护的。我的假设是,如果您想要一个可以在指定时间清除其内容的流缓冲区,那么您将实现自己的一个从标准流缓冲区类之一派生的,但提供 clear() 成员(或任何你觉得方便的名字)。在缓冲区管理器不知道的情况下更改缓冲区的内容通常是一件相当糟糕的事情......

【讨论】:

gptr()egptr() 受到保护,因此除非您正在编写实现 std::cin 最初实际使用的 streambuf 类,否则这将无济于事,除非我没有明白你的答案了吗?

以上是关于如何修改 std::cin 的内部缓冲区的主要内容,如果未能解决你的问题,请参考以下文章

如何在使用之前清除内部服务器套接字缓冲区的内容

aiohttp - 我如何查看 websocket 消息缓冲区?

如何处理错误的数据类型输入

如何从音频队列缓冲区中提取整数样本并将修改后的样本写回?

ArcGIS微课1000例0043:ArcGIS绘制国界线的3种方法

如何缓冲multiprocessing.Process内部和外部函数的所有print()?