全部学习汇总: 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的确是个不错的选择。