linux strcpy/strncpy/sprintf内存溢出问题

这篇具有很好参考价值的文章主要介绍了linux strcpy/strncpy/sprintf内存溢出问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文主要介绍strcpy/strncpy/sprintf都是不安全的,可能存在内存溢出的问题。下来进行实例分析。

strcpy代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <stdbool.h>

void test_func(char *str)
{
    bool flag = false;
    char buffer[5];

    memset(buffer, 0, 5);
    strcpy(buffer, str);
    if(strcmp("1234", buffer) == 0)
    {
        printf("buffer is 1234\n");
        flag = true;
    }
    if(flag)
    {
        printf("flag is true\n");
    }
    else
    {
        printf("flag is false\n");
    }
}
int main()
{
    test_func("45678912");
    return 0;
}

运行结果:

flag is false
*** stack smashing detected ***: <unknown> terminated
Aborted (core dumped)

这是因为数组较小,产生了越界。以上是linux gcc编译的。可能其他编译器会遇到打印是flag is true的场景,为什么会变成true呢;

strcpy代码内存溢出原因分析:

strcpy这个函数,字符串溢出了,代码中有两个局部变量,flag(bool类型),buffer(字符数组),局部变量是存放在栈空间的,并且栈上的空间是从高地址向低地址生长的,所以定义的过程类似于压栈,先压进去的flag存放在高地址,buffer存放在了低地址。当调用strcpy的时候,由于buffer的内存只占用了5个字节,拷贝进去的字符串远大于5字节的字符串,然而strcpy函数又不会截断,那字符串多出来的字节存放在哪里?写内存的时候是从低地址往高地址写,所以它会继续寻址,往后面写,写到flag这个局部变量里。所以此时flag可能已经被篡改了,此时的值不在是false了。

strncpy代码:

int dest[3];

strncpy(dest,"hi",5);

strncpy代码内存溢出原因分析:

dest只有3个字符,刚好容纳"hi"加上一个\0, //但是后面传入了5的参数,遇到\0并不会停止,而是往dest[3],dest[4]继续写入\0造成溢出。本周原因是strncpy没有对边界进行检查。

sprintf代码:


        char text[1];
        sprintf(text,"%d.%d.%d", byte1, byte2, byte3);
   );

sprintf代码内存溢出原因分析:

        前面的字符数组空间开得太小了,但是sprintf在执行时不会考虑前面的字符串数组空间是否足够,它会自动地占用后续空间,这样就会影响后面的数据,导致内存溢出。文章来源地址https://www.toymoban.com/news/detail-624929.html

到了这里,关于linux strcpy/strncpy/sprintf内存溢出问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux驱动开发】004 物理内存与虚拟内存的转换

    MMU 全称叫做 Memory Manage Unit,也就是 内存管理单元。 在老版本的 Linux 中要求处理器必须有 MMU,但是现在Linux 内核已经支持无 MMU 的处理器了。MMU主要功能: ①、完成虚拟空间到物理空间的映射。  ②、内存保护,设置存储器的访问权限,设置虚拟存储空间的缓冲特性。 

    2024年02月05日
    浏览(41)
  • 5-Linux 内存溢出oom

    Linux内核为了提高内存的使用效率采用过度分配内存(over-commit memory)的办法,造成物理内存过度紧张进而触发OOM机制来杀死一些进程回收内存。该机制会监控那些占用内存过大,尤其是瞬间很快消耗大量内存的进程,为了防止内存耗尽会把该进程杀掉。 1、oom过程 out_of_memory函

    2024年02月05日
    浏览(38)
  • 常见内存溢出与CPU 100%问题

    SQL in 过多 https://mp.weixin.qq.com/s/g5Y47cQ25KbVjzHhZcjN7g 面对 OOM 问题如果代码不是有明显的问题,下面几个JVM参数相当有用,尤其是在容器化之后。 另外提一个参数也很有用,正常来说如果程序出现 OOM 之后,就是有代码存在内存泄漏的风险,这个时候即使能对外提供服务,其实也

    2024年02月01日
    浏览(37)
  • torch.empty()造成的内存溢出问题

    代码实现的时候遇见了一个很奇怪的问题,运行同一段代码会出现一些奇怪的超大指数值,调试发现是混淆了torch.empty 和torch.zeros的概念。对torch.empty初始化的矩阵直接“+=”,出现的内存问题。 例如: 上述代码不会报错,但是结果不正确。 这是由于torch.empty 创建了矩阵会分

    2024年01月24日
    浏览(35)
  • Flink批处理metaspace内存溢出问题

    早上过来发现定时任务出现告警,Flink Jobs运行失败,登录Flinkweb后台一看,所有jobs都没了,slot也为0。 查看Flink日志,有以下错误异常: 根据错误异常不难得出,是因为metaspace内存溢出导致的。 通过日志能观察到是一个批处理任务(FlinkJobCheatFind)导致;这个批处理任务是通过

    2024年02月08日
    浏览(42)
  • 如何逐步排查因文件问题导致的内存溢出

    逐步排查内存溢出问题通常需要一系列的步骤,其中逐渐增大传输文件的大小,并观察内存使用情况,是一种合理的方法。下面是您可以采取的步骤: 增大传输文件大小: 将传输的文件大小逐步增大,这样您可以模拟更大的资源负载。这有助于观察内存使用情况在不同负载

    2024年02月11日
    浏览(39)
  • Java内存溢出问题深入探究及其解决策略

    Java内存溢出是一个常见且棘手的问题,可能会导致程序的性能急剧下降或者崩溃,给业务带来严重的影响。为了深入解析和理解此问题,本文将详细探究Java的内存模型,内存溢出的根本原因,诊断方法以及解决策略。 1.1 Java内存模型 Java内存空间主要包括以下几个部分:方法

    2024年02月09日
    浏览(48)
  • 使用asan检测内存泄漏、堆栈溢出等问题

    操作过程参考:链接 缘起:程序在移动端崩溃,mac端复现不了,于是在写个崩溃位置函数的调用demo,使用ASAN工具进行排查。 验证过程 1、代码 main.cpp 使用附加ASAN工具的方式进行编译: 执行: 没有问题,以上是验证过程,如有问题执行时ASAN会提示有问题的相关位置。 介绍

    2024年02月11日
    浏览(60)
  • 记vite打包vue项目内存溢出问题解决

    出现问题 解决方法一: 1.根据网上的资料是通过全局下载npm包increase-memory-limit: 2.在项目目录执行命令: 3. 如果报错就搜索node_modules目录下的.bin目录中的 “%_prog%” 替换为 %_prog% 解决方法二(我的解决方法): 1.全局安装cross-env 2.在package.json的scripts中的build执行命令中增加

    2024年02月12日
    浏览(34)
  • JVM:全面理解线上服务器内存溢出(OOM)问题处理方案(一)

    前段时间生产上遇到了OOM问题,导致服务出现了短时间的不可用,还好处理及时,否则也将酿成大祸。OOM问题也是生产中比较重要的问题,所以本期我们针对OOM问题特别讲解,结合理论与实际案例来带大家彻底攻克OOM问题处理。 要解决问题,我们首先要清楚问题产生的原因。

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包