Testbed静态分析常见问题总结

Testbed静态分析常见问题总结 静态代码检测遇到的一些问题总结_construct leads to infeasible code-CSDN博客一、函数必须有返回值原因1、如果一个函数声明为返回某种类型例如int、float或其他用户定义的类型但没有在函数体中提供返回值那么这个函数的行为是未定义的这通常会导致编译错误2、对于这种情况程序的行为是不可预测的。执行环境可能会填充任意的数据到函数的返回值中这取决于栈上当前的位置和内容以及编译器的具体实现。这种情况下函数的结果可能每次运行都不同甚至在同一台机器的不同时间运行也可能得到不同的结果。举例代码xxx函数a()没有返回值代码p.c中函数b的实现为jja();//a没有返回值赋值给jj实现错误二、判等和赋值混淆if或while条件判断中将判等“”写为赋值“”判断条件后执行操作语句中将赋值“”写为判等“”。三、内存缺陷泄露分析1、排查“只申请不释放”的场景比如 malloc/calloc/realloc 后未对应调用 free 或 free 前指针被覆盖如指针重新赋值原内存地址丢失。2、避免“重复释放”同一内存地址调用多次 free 和“野指针释放”指针声明后未赋值直接释放。案例指针重新赋值原内存地址丢失#include stdlib.hint main() {int *p (int*)malloc(4 * sizeof(int)); // 申请内存p指向地址Aif (p NULL) return 1;// 问题p直接指向新地址栈上变量a原地址A的内存无人指向无法释放int a 5;p a;free(p); // 此处free的是a栈内存而非原申请的堆内存原堆内存泄露return 0;}3、重点查条件判断、异常处理如 goto 跳转、函数提前 return 跳过 free 比如 if 块内申请内存 else 块未处理直接退出函数导致内存未释放。四、指针使用前未判空不能直接给空指针赋值因为空指针 NULL 指向内存中不合法的地址直接赋值会导致未定义行为程序崩溃、数据损坏等。五、哪些常见静态分析问题在GJB8114规则中属于必须修改GJB8114中shall规则必须改should规则非必须改常见必改问题举例1、函数返回值类型和函数定义类型不一致2、if...else if 缺少else分支必须加else的原因如下a.局部变量如果使用前只声明未定义只在if/else if里赋值漏掉else就会存在未赋值的路径编译报错。b.所有条件都不满足时加else可以捕获异常、防止逻辑漏洞3、swich缺少default必须加default原因如下a.电磁干扰、硬件故障、总线异常、时序异常会导致读到不在case范围内的非法值加default用于捕获异常4、局部变量未显式初始化5、#define 进行了重复定义#define MAX 100#define MAX 2006、宏改关键字#define int long7、宏重定义类型typedef int mytypetypedef float mytype8、无参数函数括号内未填写viodvoid Fun(){} 括号中缺少void