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

对字符串中的某子串进行查找并删除——一个困扰2天的小BUG:server:malloc.c:2401:sysmalloc:Assertion....failed

这两天在写一个小项目,在Linux下运行的时候,总是出现这样一个错误:我知道八成是因为malloc的数组进行了越界操作,一直在查别的地方,因为我的代码有大量的对字符串的操作,真的看

这两天在写一个小项目,在Linux下运行的时候,总是出现这样一个错误:

《对字符串中的某子串进行查找并删除——一个困扰2天的小BUG:server: malloc.c:2401: sysmalloc: Assertion....failed》

我知道八成是因为malloc的数组进行了越界操作,一直在查别的地方,因为我的代码有大量的对字符串的操作,真的看到眼花,从没想到是一个之前已经用了很多次的函数出了问题,删除子串这个功能当时是借鉴网上别人的代码写的一个小小的函数,之前的功能也一直正常用着,所以无数次与它擦肩而过,楞是在这里卡了两天….

先PO一下之前的子串删除代码:

char* delete_substr(char* str, char* sub_str) {
int i = 0;
char* temp = (char*)malloc(sizeof(char)*1024);
int sub_len = strlen(sub_str);
while(str[i] != 0) {
if(str[i] == sub_str[0]) {
strncpy(temp, str + i, sub_len);
temp[sub_len] = 0;
if(!strcmp(temp,sub_str)) {//如果找到了相匹配的字符串,就从字符串中删掉它
str[i] = 0;
strcat(str, str + i + sub_len);
i = 0;
continue;
}
}
i++;
}
return str;
}

一开始真的是可以用的,它的逻辑确实是没问题的,那么为什么我后来因为这个函数出现了malloc数组的越界访问问题呢?

问题就出在这两行:

char* temp = (char*)malloc(sizeof(char)*1024);
int sub_len = strlen(sub_str);

这个temp是用来截取str中一段与sub_str等长的字符串,然后与sub_str进行比对的临时变量。

而这里的问题就在于我把temp的长度写死了,导致如果传进来的sub_str过长,超过了1024,那么就会在下面这一行出现问题:

strncpy(temp, str + i, sub_len);

所以我的BUG就是因为我需要匹配的子串太长了,这个函数的漏洞就暴露了出来….所以抓紧修改一波~Bug解决:

char* delete_substr(char* str, char* sub_str) {
int i = 0;
int sub_len = strlen(sub_str);
char* temp = (char*)malloc(sizeof(char)*(sub_len+1));
while(str[i] != 0) {
if(str[i] == sub_str[0]) {
strncpy(temp, str + i, sub_len);
temp[sub_len] = 0;
if(!strcmp(temp,sub_str)) {//如果找到了相匹配的字符串,就从字符串中删掉它
str[i] = 0;
strcat(str, str + i + sub_len);
i = 0;
continue;
}
}
i++;
}
return str;
}

 


推荐阅读
  • 想把一组chara[4096]的数组拷贝到shortb[6][256]中,尝试过用循环移位的方式,还用中间变量shortc[2048]的方式。得出的结论:1.移位方式效率最低2. ... [详细]
  • 使用Matlab创建动态GIF动画
    动态GIF图可以有效增强数据表达的直观性和吸引力。本文将详细介绍如何利用Matlab软件生成动态GIF图,涵盖基本代码实现与高级应用技巧。 ... [详细]
  • 贡献转移在计算每个元素的作用的时候,我们可以通过反向枚举作用效果,添加到作用元素的身上,这种方法叫做贡献转移。更正式的说, ... [详细]
  • 本文回顾了作者在求职阿里和腾讯实习生过程中,从最初的迷茫到最后成功获得Offer的心路历程。文中不仅分享了个人的面试经历,还提供了宝贵的面试准备建议和技巧。 ... [详细]
  • binlog2sql,你该知道的数据恢复工具
    binlog2sql,你该知道的数据恢复工具 ... [详细]
  • 深入解析 C++ 中的 String 和 Vector
    本文详细介绍了 C++ 编程语言中 String 和 Vector 的使用方法及特性,旨在帮助开发者更好地理解和应用这两个重要的容器。 ... [详细]
  • 本文探讨了如何在PHP与MySQL环境中实现高效的分页查询,包括基本的分页实现、性能优化技巧以及高级的分页策略。 ... [详细]
  • 本文详细探讨了在Java中如何将图像对象转换为文件和字节数组(Byte[])的技术。虽然网络上存在大量相关资料,但实际操作时仍需注意细节。本文通过使用JMSL 4.0库中的图表对象作为示例,提供了一种实用的方法。 ... [详细]
  • 函子(Functor)是函数式编程中的一个重要概念,它不仅是一个特殊的容器,还提供了一种优雅的方式来处理值和函数。本文将详细介绍函子的基本概念及其在函数式编程中的应用,包括如何通过函子控制副作用、处理异常以及进行异步操作。 ... [详细]
  • 基于SSM框架的在线考试系统:随机组卷功能详解
    本文深入探讨了基于SSM(Spring, Spring MVC, MyBatis)框架构建的在线考试系统中,随机组卷功能的设计与实现方法。 ... [详细]
  • 在Android中实现黑客帝国风格的数字雨效果
    本文将详细介绍如何在Android平台上利用自定义View实现类似《黑客帝国》中的数字雨效果。通过实例代码,我们将探讨如何设置文字颜色、大小,以及如何控制数字下落的速度和间隔。 ... [详细]
  • 本文详细介绍了在Luat OS中如何实现C与Lua的混合编程,包括在C环境中运行Lua脚本、封装可被Lua调用的C语言库,以及C与Lua之间的数据交互方法。 ... [详细]
  • 本文将探讨一个经典算法问题——最大连续子数组和。我们将从问题定义出发,逐步深入理解其背后的逻辑,并通过实例分析加深理解。 ... [详细]
  • Docker安全策略与管理
    本文探讨了Docker的安全挑战、核心安全特性及其管理策略,旨在帮助读者深入理解Docker安全机制,并提供实用的安全管理建议。 ... [详细]
  • 在使用 Nginx 作为服务器时,发现 Chrome 能正确从缓存中读取 CSS 和 JS 文件,而 Firefox 却无法有效利用缓存,导致加载速度显著变慢。 ... [详细]
author-avatar
Aaron阿龙_1947_446
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有