在使用strncpy/strncat时,可能会存在如下编译警告。究其原因是在代码中,目标地址的空间大小和strncpy/strncat的最大限制大小设置成一样了。
可以看到第二张图中描述,在写入到目的字符串时,还要在目的字符串的最后写入一个尾0(‘\0’),所以需要在设置strncat/strncpy的最大限制时应注意使其小于目的字符串大小。
例如: char *dest[DESTSIZE]; strncat(sorc,dest,
DESTSIZE
);
应更改为:char *dest[DESTSIZE]; strncat(sorc,dest,
DESTSIZE-1
);
参考链接:http://baike.baidu.com/view/1207711.htm
strncpy
是
C语言
的函数之一,来自
C语言
标准库,定义于string.h,char *
strncpy
(char *destin, char *source, int maxlen),把src所指由NULL结束的字符串的前n个字节复制到dest所指的数组中。
用
strncpy
字符串拷贝时,出现
警告
:
warning
: '
strncpy
' specified bound 32 equals destination size [-Wstringop-trun
cat
ion]。
2、解决:
strncpy
不拷贝最后一个字节,手动给它赋值'\0'。
#define SIZE = 20;
char *a_str = "12345678";
char *my_
strncpy
(char *dest, const char *src, int n) {
assert(dest != NULL);
assert(src != NULL);
char *r...
memcpy:
从一个字符串复制一个字节到另外一个字符串(The memcpy() function copies n bytes from memory area src to memor area dest. ),并且两个字符串不能有重叠
区
域。
头文件包含:#include <string.h>
memcpy()函数原型:
void *memcpy(void *dest, ...
缓冲
区
溢出
指的是应用程序将数据写到一个较小缓冲
区
中所导致的程序漏洞。缓冲
区
溢出
漏洞通常被攻击者用于重写内存中的数据。由于象C和C++语言,程序员可对内存进行操纵就会导致缓冲
区
溢出
风险。
在C和C++程序中发现的很多早期缓冲
区
溢出
漏洞,都是由字符串操作引起的。比如
使用
strcpy()和str
cat
()这样的函数。针对这种情况,引入了这些函数的有边界限制的等价函数,如
strncpy
()和
strn
ca
C++字符串的
使用
时最容易出现
溢出
,通过
使用
strncpy
(),snprintf(),
strn
len(),memset()这几个函数可以帮助我们减少
溢出
的出现。
char *
strncpy
(char *dest, const char *src, size_t n);
src串的长度应该小于dest缓冲
区
的大小,且n为dest缓冲
区
的大小减1或者更小,
即至少留出一个位置给'\0'。
缓冲
区
溢出
一般是由于一下原因导致:
1.字符串处理函数没有指定长度,单单凭借结尾字符是不是'\0'来判断结束。
2.被处理的字符超过缓冲
区
可接受的大小。例如,从屏幕输入字符串:gets(buff),但是buff的内存少于屏幕一行字符个数,就会导致
溢出
,应该
使用
fgets。
3.所有格式化字符串的函数:fprintf("%n",&num_write)。
避免的办法:
1.不要用%n