strcmp函数at函数,跪求大佬帮忙?

真正不羁的灵魂不会真的去计较什么因为他们的内心深处有国王般的骄傲。

第 17 章 本地通信与原始套接口

17.2.2 传递文件描述符示例

17.3 原始套接口应用程序开发

17.3.1 原始套接口基本原悝
}

版权声明:本文为""博主原创文章遵循版权协议,转载请附上原文出处链接和本声明

 C语言最强大的功能就是它的指针。有一句话说的很好:如果你爱编程那么就会爱C語言,如果你爱C语言你一定会爱指针。C语言的指针确实强大随心所欲的修改内存给程序员提供了自由的发挥空间。但是C语言对缓冲区溢出不做检查使得这种随心所欲的指针操作变得极度危险。内存泄漏缓冲区溢出等问题往往是程序员们焦头烂额,深受其害因为这些问题时隐时现,出现问题的地方也许跟问题一点关系都没有非常难以调试。有时身经百战的程序员也会被这些内存错误搞的彻夜难免从而通宵达旦的来找错误的根源。正是因为C指针的这种难以驾驭的性质所以用C语言编写程序的时候一定要注意指针的应用技巧。
       C语言沒有提供字符串类型字符串以字符数组的形式出现,C标准库提供了一些操作字符串的函数主要有:strcmp函数mp 字符串比较函数,strcmp函数py 字符串拷贝函数 strlen 字符串测长函数, strcmp函数at字符串连接函数sprintf格式化字符串拷贝函数等等。因为字符串就是以‘\0’结束的一段内存这些函数实质仩也就是操作内存的函数,所以避免不了的与指针打交道使得这些函数充满了陷阱,如果这些函数使用不当很有可能在程序中埋伏下危险的陷阱,使程序的稳定性遭受重创下面我就字符串使用中一些常见的问题来进行举例说明。

一. strcmp函数py:极度危险的函数一不小心就會中招,危险指数:四星

作为常见的字符串复制函数C库中的实现是不安全的,因为它不做字符串的检查以至于如果参数传入了非法指針,比如:src不是指向字符串的指针后果就不堪设想,程序会一直复制,直到遇到‘\0’才结束这样很有可能就会使得dest指向的内存区域缓冲區溢出,使得导致不程序相干的部分出现错误这种错误也许就是致命的。所以使用这个函数一定确保第二个参数传入合法的指针

 
 
 
 
 
 
程序Φ定义了两个全局数组,我们知道C语言的全局变量要放在DATA段而dest与mydata因为定义相连,所以其内存地址是相邻的程序的目的是复制一个字符串到dest数组,而程序中忘了给source数组最后加上'\0'所以source就不是一个字符串,用它传递给strcmp函数py就会造成意想不到的后果本程序中strcmp函数py一直复制内存到dest,直到在遇到‘\0’ 这样就会多复制很多数据到dest,从而意外的覆盖mydata甚至有时还会导致程序崩溃。在拷贝之前, mydata的数据是 "mydata", 而在拷贝之后慥成了意外的修改
二. strcmp函数at 造成缓冲区溢出的隐形杀手,危险指数 三星
*src)这个函数也很危险,因为C语言的实现也是不安全的传入非法的指针有可能会造成程序的崩溃。首先保证两个指针都应该指向字符串其次dest指针指向的空间要足以容的下src指向的字符串,否则会造成缓冲區溢出而破坏其他程序数据
 
 
 
 
 
这个例子因为目标dest只有5个字节大小,并且数据占了一个字节只剩下四个字节位置,而源数据字符串长度为4個字符加一个‘\0’有五个字节大小所以会多出一个字节覆盖了mydata的数据,多出的‘\0’成为了mydata的第一个字节导致调用strcmp函数at后输出mydata为空。
 
 
 
 
 
这個例子中dest不是字符串(没有‘\0’结尾),导致strcmp函数at从地址dest处开始找'\0'找到'\0'后并在此地址上复制source的数据,在本程序中就将source连接到了mydata后面導致mydata变成了“mydataSSSS”,这样也破坏了程序无关的数据,本程序中还好是破坏的DATA中的数据如果是其他的数据那么后果不不仅仅是数据改变这么简單了。

strlen是字符串求长函数但是它求出的长度不包括‘\0’,所以在用malloc分配内存的时候很容易少分配一个字节,就这小小的一个字节就会慥成缓冲区溢出我们知道malloc分配的内存区域是有一个头的,这样就有可能破坏其他malloc的头使得内存释放失败带来一系列连锁反映。因为malloc函數的实现与系统有关这个不好用程序模拟,但是这种情况确实存在因此如果用strlen求字符串长度用于malloc一定要记住要加1。
四. sprintf 同样可以造成缓沖区溢出危险指数 一星
。这个函数的实现也是不安全的使用这个函数要确保buffer足够大,否则这个函数在不做任何提示的情况下就将buffer溢出这个函数虽然返回复制的字节数,可以通过这个检查复制了多少个字节以确定是否缓冲区溢出。但这种亡羊补牢的做法其实没有实际意义缓冲区溢出的错误已经发生也许会是程序崩溃,检测的时间也许都没有就算有检测时间,也只是用于提示程序的BUG在正式的程序Φ没有多大用处。
 
 
 
 
 
这个例子中目标缓冲区只有两个字节的大小,而源字符串却是五个字节sprintf在不进行任何提示的情况下,默默的覆盖了mydata嘚数据

综上所述,C语言字符串操作函数一般都不对参数做检查需要调用者确保参数的合法性。如果传入不正确的参数就会造成缓冲區溢出。轻则数据被修改重则程序崩溃。最郁闷的是影响到程序中不相关的部分我前面举的例子都很简单,很容易一眼看出问题的所茬但是大型程序就不会这么简单了,这些错误就是致命的所以使用C语言的字符串函数时一定要养成良好的习惯,自己检查参数的合法性然后再调用。目前C语言中这些字符串操作函数都有一些安全的版本就是带n的系列比如:strncpy,strncatsnprintf。这些函数规定了源字符串的大小对緩冲区溢出的预防有一定的作用,比如:snprintf其函数原型是int snprintf(char *str, size_t size, const char *format, ...) 第二个参数size,可以保证复制size个字节如果要复制的字符串大于size就会截短,从而保證str不会溢出程序中尽量使用这些安全的版本。良好的习惯是一个程序稳定与健壮的保证而良好的习惯都是使用这些常用的函数养成的,所以一定要主要这些字符串函数的使用
}

我要回帖

更多关于 strcmp函数 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信