字符串数组越界bug(2)

概述

数组下标从0开始,虽然从初学都已经知道,《陷阱与缺陷》反复强调,而在指尖运动中,就有那么几次不小心,让“精子”掉进这个“洞里”!其次,C语言字符串必须以0收尾!

bug:

1-动态malloc或静态分配size大小字符串,存储size个字符,导致无0收尾,逾越警戒线,站在悬崖边了!

2-动态malloc或静态分配size大小字符串,访问或设置 [ size ] 字符

3-动态malloc或静态分配size大小字符串,没有初始化,导致无0收尾,读取整串越界(VC下常见烫烫。。。,曾经一个初学者说他看到吓坏了,以为机器要暴喽)幸运的话,能在越界内存中遇到个0结束输出,不幸运喽,段错误,把你当成攻击者,暴力中止!

bug示例:

        string = search_get_string_hash_table(word);
	if(string == NULL) { //哈希表中不存在此串
		string = malloc_str(size);//分配内存,然后拷贝
		if(string == NULL)
			return ERR_MEM;
		strncpy(string, word, size);
		string[size + 1] = 0; //bug,->string[size] = 0;注意在malloc_str中分配的是size+1字节,所以最后一个是string[size]
		put_string_hash_table(string);//放入哈希表
	}
	//哈希表中存在此串
	return string;

这是个人写的代码,还记得写完strncpy后,立马在后面来了这句string [ size + 1 ] = 0;收尾的语句。拷贝了size字节,size+1字节收尾,想都不带多想一点的,觉得很自然^_^,敲的还挺潇洒。擦,等到哈系表出现一堆不需要的字符串后,不潇洒了。虽然很低级,但是总会发生。虽然平时不会犯,熬夜加班后就是可能发生。这就是细节决定成败,四两拨千斤的活生生例子。

解决办法:

1-动态分配用调用memset(addr, 0, size),静态 = { 0 }初始化,养成习惯

2-访问边界字符时候,比较下标和大小是不是差1

3-如果需要逐个访问,那么逆序递减访问数组,下标以0结束是个不错选择,但是字符串一般不可行!字符串没有倒序输出的。

4-最笨的方法:牢记数组下标范围[0 - size-1],使用时候多瞅两眼!

5-自己封装需要的接口

6-使用C++string库,它会简化你紧张的心情

时间: 2024-10-13 09:09:54

字符串数组越界bug(2)的相关文章

一次数组越界的bug经历

数组和指针都是C里面的好东西,但是一旦使用不当,真的会让人抓狂. 下面是写程序时遇到的一次数组越界的经历,感觉对以后写程序有点启发,所以记录下来. 起因: 我想用OLED动态显示一组浮点数,而且浮点数的长度是不定的. 1.如果只是单纯的显示,没有消隐的话,上一次的长数的据残留会影响下一次短长度数据的显示. 2.如果显示一次就清空一次显示区域的话,数据会一直抖动,一开始以为是我刷新频率不够,故把刷新频率由100HZ改为1000HZ,但是效果还是和之前一样! 后来想想也是,不管我把刷新频率改为多少,

C 入门 第五节 多维数组 字符串数组

#pragma mark  ----------二维数组----------int main(int argc, const char * argv[]) {/*    1 . 二维数组的本质:将数组作为数组元素的数组,称为数组的数组    2 . 类如:管理一个班4个学生的年龄,将一维数组作为数组元素,存储到另一个数组中    int age[4] = {12,13,14,15};    12,13,14,15    21,22,23,24    31,32,33,34    3 . 为了形象

OC ---- 字符串 数组 iOS学习-----细碎知识点总结

NSString *urlString = [NSString stringWithFormat:@"http://www.apple.com"];        // 获取字符串长度    NSLog(@"长度:%lu", [urlString length]); // 求子字符串    NSLog(@"%@", [urlString substringFromIndex:4]);    NSLog(@"urlString = %@&

数组越界

1. 找出下列代码的错误 void test() { char string[10]; char *str="0123456789"; strcpy(string,str); }字符串str需要11个字节才能存放下(包括末尾的'\0'),而string只有10个字节的空间:strcpy会导致数组越界. void test() { char string[10]; char str[10]; int i; for(int i=0; i<10; i++) { str[i]='a';

C语言数组:C语言数组定义、二维数组、动态数组、字符串数组

1.C语言数组的概念 在<更加优美的C语言输出>一节中我们举了一个例子,是输出一个 4×4 的整数矩阵,代码如下: #include <stdio.h> #include <stdlib.h> int main() { int a1=20, a2=345, a3=700, a4=22; int b1=56720, b2=9999, b3=20098, b4=2; int c1=233, c2=205, c3=1, c4=6666; int d1=34, d2=0, d3

JNI官方文档翻译3-基本数据类型 字符串 数组

在使用JNI的时候,你问的最多的问题莫过于 Java的数据类型和C/C++的数据类型怎么一对一映射.在我们的HelloWord例子当中,我们并没有传入任何参数给我们的java层print方法,native方法也并没有返回任何数据而是void,本地方法只是简单的打印一个字符串,然后就返回了.实际开发中我们都需要传入参数,返回参数,本章就会讨论如何从java层向底层传数据,以及如何从底层向java层返回数据.我们从基本数据类型 字符串 数组开始, 下一章再介绍如何传任意类型的数据,以及如何访问他们的

【汇编杂项】关于_高级语言中 数组越界与汇编中 栈溢出的_联系的思考

数组越界 数组越界,是刚开始学习编程时,就不断被别人提醒的一个点,“相当可怕”.获取不合理数值,造成程序异常or操作计算机重要内存,造成威胁...原因是什么呢?数组在汇编中以栈机制实现,其中内存分配的机制与数组越界的风险有很大关系.今天做个小实验,来简单探讨下这个. 代码 先展示问题代码 1 #include<stdio.h> 2 int main(){ 3 int a[3]={0,1,2}; 4 for(int i=0;i<=3;i++){ 5 a[i]=0; 6 printf(&qu

字符串数组中两个字符的最短距离

[leetcode] https://leetcode.com/problems/shortest-word-distance/ For example,Assume that words = ["practice", "makes", "perfect", "coding", "makes"]. Given word1 = "coding", word2 = "practic

Java求字符串数组交集 并集 差集 去重复并集

//系统方法 package com; import java.util.ArrayList; import java.util.Iterator; import java.util.List; public class Test { public static void main(String[] args) { List list1 =new ArrayList(); list1.add("1111"); list1.add("2222"); list1.add