Be carefull when using string operating function declarated in "string.h"

        as we know that by adding "#include<string.h>"  in the head of the code, we benifit a lot from the string operating funtion , such as strcpy() ,strncpy, strcmp() , strncpy ...., and so on.

       however it's also easy to make your process crash if you give a NULL value point param to those string operating funtion, such as :


/* strncmp.c by vinco at 2011-08-03
*  ubuntu 9.10 CC/GCC
*/
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
#define BUFLEN_32 32

int strncasecmp_s(const char *s1,const char *s2,int n);
char* strncpy_s(char *dst, char * src ,int n);

int main()
{
	//char s1[BUFLEN_32]="zhang";
	//char s2[BUFLEN_32];
	//bzero( s2, BUFLEN_32 );// bzero(s2,sizeof(s2))

	char* s1 ="zhang";
	//char* s2 = (char*)malloc(BUFLEN_32);
	char* s2 = NULL;

	//printf("s1 = %s\ns2 = %s\n",s1,s2);
	//printf("s1 = %p\ns2 = %p\n",s1,s2);

#if 1
	if(!(strncasecmp(s1,s2,BUFLEN_32)))
#else
	if(!(strncasecmp_s(s1,s2,BUFLEN_32)))
#endif
	{
		printf("they are equal\n");
	}
	else
	{
		printf("not equal\n");
	}

#if 1
	strncpy(s2,s1,BUFLEN_32);
#else
	strncpy_s(s2,s1,BUFLEN_32);
#endif
	printf("s1 = %s\ns2 = %s\n",s1,s2);
}

int strncasecmp_s(const char *s1,const char *s2,int n)
{
	char emptystr='\0';
	const char *str1=s1;
	const char *str2=s2;

	if(str1==NULL) str1=&emptystr;
	if(str2==NULL) str2=&emptystr;

	return strncasecmp(str1,str2,n);
}

char* strncpy_s(char *dst, char * src ,int n)
{
	if(dst == NULL || src ==NULL)
		return NULL;
	return strncpy(dst,src,n);
}

1. in this case we take the following function specifically :

char * s2 = NULL
if(!(strncasecmp(s1,s2,BUFLEN_32)))

 
 
 
 

 
 
strncpy(s2,s1,BUFLEN_32);

 
 

  compile and run specifically 
 

root@vinco:/home/vinco# gcc strncasecmp.c  -o strncasecmp
root@vinco:/home/vinco# ./strncasecmp 
Segmentation fault
root@vinco:/home/vinco# gcc strncasecmp.c  -o strncasecmp
root@vinco:/home/vinco# ./strncasecmp 
not equal
Segmentation fault

both strncmp() and strncpy() are not safety to our process if we just give it a NULL value point

 

2 . to void the unexpected crash , we should check the point before entry those function ,just as strncmp_s() strncpy_s() did,( _s means safety way)

or give enough memory as the comment say:

    i . use  array(it allocate memory abviously):

	char s1[BUFLEN_32]="zhang";
	char s2[BUFLEN_32];
   

    ii . allocate memory for the point by yourself(remember to add free() if your want to porting it to a big project )

char* s2 = (char*)malloc(BUFLEN_32);



你可能感兴趣的:(Be carefull when using string operating function declarated in "string.h")