热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

如果我向12字节缓冲区写入少于12个字节会发生什么?

如何解决《如果我向12字节缓冲区写入少于12个字节会发生什么?》经验,为你挑选了3个好方法。

可以理解的是,将缓冲区错误输出(或创建溢出),但如果12字节缓冲区中使用的字节少于12个,会发生什么?是否有可能或者空尾随时都是0?正交问题可能会有所帮助:缓冲区在实例化但未被应用程序使用时包含哪些内容?

我在Visual Studio中查看了几个宠物程序,似乎它们附加了0(或空字符),但我不确定这是否是一个可能因语言/编译器而异的MS实现.



1> selbie..:

采用以下示例(在代码块内,而不是全局):

char data[12];
memcpy(data, "Selbie", 6);

甚至这个例子:

char* data = new char[12];
memcpy(data, "Selbie", 6);

在上述两种情况下,前6个字节的dataS,e,l,b,i,和e.剩下的6个字节data被认为是"未指定的"(可以是任何东西).

是否有可能或者空尾随时都是0?

根本不保证.我所知道的唯一保证零字节填充的分配器是calloc.例:

char* data = calloc(12,1);  // will allocate an array of 12 bytes and zero-init each byte
memcpy(data, "Selbie");

缓冲区实例化但应用程序尚未使用时包含哪些内容?

从技术上讲,根据最新的C++标准,分配器提供的字节在技术上被认为是"未指定的".你应该假设它是垃圾数据(任何东西).不要对内容做任何假设.

使用Visual Studio进行调试构建通常会使用with 0xcc0xcdvalues 初始化缓冲区,但在发布版本中不是这种情况.但是,对于Windows和Visual Studio,有一些编译器标志和内存分配技术可以保证零初始内存分配,但它不可移植.


"你应该假设它可以填充随机字节." - 这个答案很好,但我想反对使用"随机"这个词.分配内存然后读取它不是随机性的良好来源.
"剩余的6个字节的数据是未定义的,但将是一些东西." - 不,这是错的!在未定义的行为中访问未初始化的值.你不能在假设"好吧,那里有东西,我不关心什么,无关紧要"的情况下编写代码.假设未发生对未初始化值的访问,优化器可能会完全重新排列您的代码.
"剩余的6个字节的'数据'是未定义的,但将是一些东西." 但如果它们未定义,那么试图确定"某事"是不是不明确的行为?所以它并不重要,唯一的解决方案是永远不要读未初始化的内存.这不是"随机性"的情况(特别是不作为RNG); 相反,我会说假设未初始化的数据是*有毒*.读取`char`类型可能有一个例外,它不能有陷阱表示或填充,但它仍然没有意义或好的代码进入读取未初始化部分的情况.
@Wilson这是一个任意值(虽然很容易在视觉上识别).[不同的值有不同的含义.](/sf/ask/17360801/)原因是在调试期间给开发人员提供了关于出错的提示(或者简单地说,哪些变量尚未初始化).

2> Matthew Fish..:

C++具有存储类,包括全局,自动和静态.初始化取决于如何声明变量.

char global[12];  // all 0
static char s_global[12]; // all 0

void foo()
{
   static char s_local[12]; // all 0
   char local[12]; // automatic storage variables are uninitialized, accessing before initialization is undefined behavior 
}

一些有趣的细节在这里.



3> Agent_L..:

考虑你的缓冲区,用零填充:

[00][00][00][00][00][00][00][00][00][00][00][00]

现在,让我们写10个字节.值从1开始递增:

[01][02][03][04][05][06][07][08][09][10][00][00]

现在再次,这次,4倍0xFF:

[FF][FF][FF][FF][05][06][07][08][09][10][00][00]

如果在12字节缓冲区中使用少于12个字节会发生什么?是否有可能或者空尾随时都是0?

您可以根据需要进行编写,其余字节保持不变.

正交问题可能会有所帮助:缓冲区在实例化但未被应用程序使用时包含哪些内容?

未指定.预计之前使用此内存的程序(或程序的其他部分)会留下垃圾.

我在Visual Studio中查看了几个宠物程序,似乎它们附加了0(或空字符),但我不确定这是否是一个可能因语言/编译器而异的MS实现.

这正是你的想法.这次有人为你做过这件事,但不能保证它会再次发生.它可能是附加清理代码的编译器标志.某些版本的MSVC用于在调试中运行但不在发布时使用0xCD填充新内存.它也可以是一个系统安全功能,在将内存提供给您的进程之前擦除内存(因此您无法监视其他应用程序).永远记得在重要的地方使用memset初始化缓冲区.最终,如果您依赖新缓冲区来包含某个值,则在自述文件中使用某些编译器标志.

但清洁并不是必需的.你需要一个12字节长的缓冲区.你用7个字节填充它.然后你把它传递到某个地方 - 你说"这里有7个字节".从中读取缓冲区的大小无关紧要.您希望其他函数尽可能多地阅读,而不是尽可能多地阅读.实际上,在C语言中通常无法判断缓冲区的长度.

并附注:

可以理解的是,将缓冲区错误输出(或创建溢出)

它没有,这就是问题所在.这就是为什么它是一个巨大的安全问题:没有错误,程序试图继续,所以它有时执行它从未意图的恶意内容.因此,我们不得不向操作系统添加一堆机制,例如ASLR,这将增加程序崩溃的可能性并降低其继续损坏内存的可能性.因此,永远不要依赖那些事后的守卫并亲自观察你的缓冲区边界.


推荐阅读
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • 流数据流和IO流的使用及应用
    本文介绍了流数据流和IO流的基本概念和用法,包括输入流、输出流、字节流、字符流、缓冲区等。同时还介绍了异常处理和常用的流类,如FileReader、FileWriter、FileInputStream、FileOutputStream、OutputStreamWriter、InputStreamReader、BufferedReader、BufferedWriter等。此外,还介绍了系统流和标准流的使用。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • C语言注释工具及快捷键,删除C语言注释工具的实现思路
    本文介绍了C语言中注释的两种方式以及注释的作用,提供了删除C语言注释的工具实现思路,并分享了C语言中注释的快捷键操作方法。 ... [详细]
  • 后台获取视图对应的字符串
    1.帮助类后台获取视图对应的字符串publicclassViewHelper{将View输出为字符串(注:不会执行对应的ac ... [详细]
  • 《数据结构》学习笔记3——串匹配算法性能评估
    本文主要讨论串匹配算法的性能评估,包括模式匹配、字符种类数量、算法复杂度等内容。通过借助C++中的头文件和库,可以实现对串的匹配操作。其中蛮力算法的复杂度为O(m*n),通过随机取出长度为m的子串作为模式P,在文本T中进行匹配,统计平均复杂度。对于成功和失败的匹配分别进行测试,分析其平均复杂度。详情请参考相关学习资源。 ... [详细]
  • Linux环境变量函数getenv、putenv、setenv和unsetenv详解
    本文详细解释了Linux中的环境变量函数getenv、putenv、setenv和unsetenv的用法和功能。通过使用这些函数,可以获取、设置和删除环境变量的值。同时给出了相应的函数原型、参数说明和返回值。通过示例代码演示了如何使用getenv函数获取环境变量的值,并打印出来。 ... [详细]
  • Android源码深入理解JNI技术的概述和应用
    本文介绍了Android源码中的JNI技术,包括概述和应用。JNI是Java Native Interface的缩写,是一种技术,可以实现Java程序调用Native语言写的函数,以及Native程序调用Java层的函数。在Android平台上,JNI充当了连接Java世界和Native世界的桥梁。本文通过分析Android源码中的相关文件和位置,深入探讨了JNI技术在Android开发中的重要性和应用场景。 ... [详细]
  • 31.项目部署
    目录1一些概念1.1项目部署1.2WSGI1.3uWSGI1.4Nginx2安装环境与迁移项目2.1项目内容2.2项目配置2.2.1DEBUG2.2.2STAT ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
  • 本文介绍了GTK+中的GObject对象系统,该系统是基于GLib和C语言完成的面向对象的框架,提供了灵活、可扩展且易于映射到其他语言的特性。其中最重要的是GType,它是GLib运行时类型认证和管理系统的基础,通过注册和管理基本数据类型、用户定义对象和界面类型来实现对象的继承。文章详细解释了GObject系统中对象的三个部分:唯一的ID标识、类结构和实例结构。 ... [详细]
  • 本文总结和分析了JDK核心源码(2)中lang包下的基础知识,包括常用的对象类型包和异常类型包。在对象类型包中,介绍了Object类、String类、StringBuilder类、StringBuffer类和基本元素的包装类。在异常类型包中,介绍了Throwable类、Error类型和Exception类型。这些基础知识对于理解和使用JDK核心源码具有重要意义。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • ejava,刘聪dejava
    本文目录一览:1、什么是Java?2、java ... [详细]
  • C语言自带的快排和二分查找
    Author🚹:CofCaiEmail✉️:cai.dongjunnexuslink.cnQQ😙:1664866311personalPage&#x ... [详细]
author-avatar
华力
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有