静态代码分析字符串

静态代码分析字符串

ID:30471555

大小:106.71 KB

页数:28页

时间:2018-12-30

静态代码分析字符串_第1页
静态代码分析字符串_第2页
静态代码分析字符串_第3页
静态代码分析字符串_第4页
静态代码分析字符串_第5页
资源描述:

《静态代码分析字符串》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库

1、静态代码分析字符串静态代码分析--字符串2010年12月10日下午03:41一、字符串在百度PS的地位字符串在百度PS的地位自然不必多说,如果你有代码权限的话,在检索端任意模块的源码中grep一下strcpy就知道了。从用户输入的一个query到返回给用户的整个页面都是用字符串来组织的,怎样将用户输入的字符串经过缜密的分析、最终决定返回给用户哪些结果,并持续提升这两者的相关性是我们不断追求并永远追求的目标。这个过程中充斥着对各种字符串倒来倒去的无休止的复杂操作。详细了解字符串相关技术并思考如何最大程度、最小成本的保证程序中对字符串操作的正确性就显得尤为重要了,本

2、文就与您共同探索一下字符串的奥秘。二、字符串的基本概念先介绍大家都知道的字符串定义:由零个或多个字符顺序排列组成的有限序列。它是一种特殊的线性表,其特殊性主要体现在组成表的每个元素均为一个字符,以及与此相应的一些特殊操作。这个简单定义中值得我们关注的地方有:1、字符串可能由0个字符组成,也就是空串,千万不要小瞧空串,很多程序bug就是在没有考虑空串这个特殊情况时产生的。2、字符串是有限序列,一般的说,有两种类型的字符串数据类型:"定长字符串",和"变长字符串"。在现代高级编程语言中大多支持变长字符串,例如c++中的StringBuffer类。所有变长字符串还是在

3、长度上有个极限,一般的说这个极限只依赖于可获得的内存的数量。3、定义中并没有限定字符串的表示法和组织形式,虽然通常c编程语言中都是以NULL(ASCII码是0)为结束符,而组织形式通常是以字符数组的形式。但是并不排除其他的组织形式存在,例如,c++和java中的string类型就是将基本字符串包装成了类的高级应用;而Pascal语言的组织更是诡异:以一个整数值开头来表示整个字符串的长度,而没有任何结束符标志,大家坐公交车时也可以想一想这种组织方法有哪些弊端,反正我只知道Pascal是输掉了与c的争宠,?。当然,可能还有其它的表示法,使用树和列表可以使得一些字符串

4、操作(如插入和删除)更高效,这里就不多加讨论了,后面讨论的都是c风格的字符串,即以'[message]'结尾的字符串,这里大家不要认为只有一种字符串的组织形式就好了。4、定义中提到每个元素均为一个字符,这里的一个字符是广义的字符概念,并不是我们日常理解的1个byte,这个字符是编码字符,常见的就是单字节表示的ascII编码字符,但是有些意音文字的语言比如汉语、日语和朝鲜语(合称为CJK)的合理表示需要远远多于256个字符(每字符一个字节编码的极限),由此产生的编码方式真是五花八门,足够写一本史记,从GBK、BIG-5到UTF-8、再到强大的Unicode,百家争

5、鸣的繁华背后全是字符编码测试人员的眼泪,Unicode有望一统天下,但也是任重而道远…5、各种针对字符串操作的库可能随着c语言的出现就存在了,古老的要死,虽然我们一直在使用它们,但是对其中某些函数的了解还不够深入,基于效率考虑,函数的设计者将某些责任推给了程序员,我们仍然非常有必要知道这些规范。检查点测试方法注意空串代码检查看到代码中有对字符串的操作就要想起是否可以正确处理空串,一般字符串为空的处理逻辑都比较简单(谁也不可能一个劲折腾空串玩),用眼睛"执行"一下应该可以发现问题。是否在栈上定义了超大字符数组代码检查+valgrind]考虑是否可以把这个数组放在堆

6、上,栈不是无限用的,听说过"爆栈"么?我们的线上机器的每线程8M栈空间曾经就爆过,可惨啦,用valgrind套件的massif工具可以检查出来。详见三、字符串与数组的暧昧关系1、共同点--char型数组因为字符串本质与数组并没有什么实质区别,字符串完全可以看做是char型数组加结束符,因此可以像操作数组那样自由操作字符串,可以充分发挥c语言指针的强大作用,在一个字符串上做你想要的任何操作,比如:可以使用&(取地址)运算符来找到字符串中某个字符的内存地址;也可以通过对指向某个字符串的指针使用*(取内容)运算符来得到实际的字符;再取地址、地址++、再取值、值++、等

7、等,有点像那些变态的面试题哈?。2、不同点--结束符结束符是字符串和数组最大的不同,一些输入输出函数就是通过判断结束符来运行的,比如在执行printf("%s",str);函数时,每输出一个字符检查一次,看下一个字符是否'[message]'。遇'[message]'就停止输出,没有'[message]'当然就停不下来了,结束符的重要性立显。四、字符串的初始化1、字符串常量和字符数组说起字符串的初始化就不得不说字符串常量和字符数组。字符数组是元素类型为字符的数组,它既具有普通数组的一般性质,又具有某些特殊性质。字符串常量是用双引号包围的字符序列。存储字符串常量时

8、,系统会在字符序列后自动

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。