热门标签 | 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;
}

 


推荐阅读
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 在金融和会计领域,准确无误地填写票据和结算凭证至关重要。这些文件不仅是支付结算和现金收付的重要依据,还直接关系到交易的安全性和准确性。本文介绍了一种使用C语言实现小写金额转换为大写金额的方法,确保数据的标准化和规范化。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本文详细介绍如何使用arm-eabi-gdb调试Android平台上的C/C++程序。通过具体步骤和实用技巧,帮助开发者更高效地进行调试工作。 ... [详细]
  • PyCharm下载与安装指南
    本文详细介绍如何从官方渠道下载并安装PyCharm集成开发环境(IDE),涵盖Windows、macOS和Linux系统,同时提供详细的安装步骤及配置建议。 ... [详细]
  • 本文详细介绍如何使用Python进行配置文件的读写操作,涵盖常见的配置文件格式(如INI、JSON、TOML和YAML),并提供具体的代码示例。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • CentOS7源码编译安装MySQL5.6
    2019独角兽企业重金招聘Python工程师标准一、先在cmake官网下个最新的cmake源码包cmake官网:https:www.cmake.org如此时最新 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文介绍了一款用于自动化部署 Linux 服务的 Bash 脚本。该脚本不仅涵盖了基本的文件复制和目录创建,还处理了系统服务的配置和启动,确保在多种 Linux 发行版上都能顺利运行。 ... [详细]
  • 本文详细介绍了 GWT 中 PopupPanel 类的 onKeyDownPreview 方法,提供了多个代码示例及应用场景,帮助开发者更好地理解和使用该方法。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
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社区 版权所有