全部学习汇总: GreyZhang/c_basic: little bits of c. (github.com)

欢迎路过的YUAN类朋友相互交流,以下是我的联系方式:

Email:greyzhang@126.com

微信:grey0612

静态代码检测遇到了一处memcpy函数使用的错误,但是我却没有使用过这个函数。找来文档看了下,顺便写个最简单的代码练习练习。

memcpy函数的声明原型如下:

void *memcpy(void * str1, const void *str2, size_t n);

第二个参数是即将被拷贝的原始字符串,第一个参数是拷贝内容最终存放后的字符串,第三个参数用来指定拷贝的字节数。函数具有一个返回值,一个指向str1的void类型的指针。

代码演示1如下:

执行结果:

从结果可以看到,整个字符串全都被拷贝。但是,memcpy函数执行前dest字符串还为空。

代码演示2:

执行结果:

此次,memcpy之拷贝了10个字节的数据。

需要注意的是,如果dest定义为局部变量可能第一个printf输出的内容为乱码,因为局部变量没有初始化。定义为全局变量,全局变量是否初始化整个跟编译器还是相关的,我用过的编译器基本上都会将数据初始化为0或者空。

代码演示3:

运行结果:

其实,此处出现了内存访问的越界。在嵌入式软件尤其是实时性、安全性要求比较高的地方这种问题经常会引起很多麻烦。在此,借由polysapce的code prover进行简单的检查看一下检测结果。

code prover检测结果:

在指针、数组、内存访问的安全与可靠性检测上,polyspace的确是个不错的选择。