静态分析和c/c++程序

xqing157 2003-10-09 10:56:24
静态分析是软件测试技术的一种.c/c++ java是目前最流行的语言。
1,带参数的new
在指定地址的已有内存区上构造对象。使用带参数的new。它们常常在静态分析的时候造成内存泄漏的假象。
#include "stdafx.h"
#include "string.h"

class xq
{
public:
xq()
{
members=0x1010101;
printf("constructor of xq\n");
};
int members;
~xq()
{
printf("destructor of xq\n");
members=0;
}
static xq* appoint(void *);
void *operator new(unsigned int size, void *p) { return p; }
void operator delete(void *p1,void* p2){}
void operator delete(void *p){::operator delete(p);}
};
xq* xq::appoint(void *p)
{
return new(p) xq;
}
int main(int argc, char* argv[])
{
char buff[sizeof(xq)];
memset(buff,0,sizeof(xq));
xq *p=xq::appoint(buff);
for(int i=0;i<sizeof(buff);i++)
printf("buff[%d] is %d\n",i,buff[i]);
p->~xq();
for(i=0;i<sizeof(buff);i++)
printf("buff[%d] is %d\n",i,buff[i]);
return 0;
}
...全文
33 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
xqing157 2003-10-09
  • 打赏
  • 举报
回复
4,无成员或不访问成员的空指针引用
#include "stdafx.h"

class xq
{
public:
void DoSomething()
{
printf("hello !\n");
}
};
int main(int argc, char* argv[])
{
xq *p=NULL;
p->DoSomething();
return 0;
}
使用空指针去访问静态成员也不会有问题。
总之Null Pointer Dereference只有有了内存的实际访问后才会发生。
xqing157 2003-10-09
  • 打赏
  • 举报
回复
3,引用返回空
#include "stdafx.h"
class xq
{
public:
xq& GetObject(void)
{
printf("hello!\n");
return *((xq*)0);//----->it seems Null Pointer Dereference
}
};
int main(int argc, char* argv[])
{
xq a;
a.GetObject();
return 0;
}
引用总是造成错觉,碰到引用的情况只要还没有实际内存动作都不会出错。
比如一个函数的参数时引用。
Foo(int &); 调用的时候Foo(*(int*)0);这种情况至少调用的时候不会有问题,如果实际的执行过程中,Foo避免了产生实际内存动作的执行路径,那也就没有问题了。
下面的情况和上述的情况一样。
xqing157 2003-10-09
  • 打赏
  • 举报
回复
2,偏移量计算
经常需要计算某个域在结构中的偏移量,常常使用一个看上去好像是空指针引用的宏。它们在静态分析的时候经常造成空指针引用的假象。
#include "stdafx.h"

#define offset(type,field) (&(((type*)0)->field))
struct xq
{
int i,j;
};
int main(int argc, char* argv[])
{
printf("offset of j is%d\n",offset(xq,j));
return 0;
}
在c/c++中 & 和 sizeof 两个符号经常具有很大的迷惑性。&((type*)0)->filed sizeof(((type*)0)->filed) 看上去象是已经引用了空指针,实际上没有。
下面也是两种看上去好像是空指针引用的情况。
bjxudong 2003-10-09
  • 打赏
  • 举报
回复
不知使用的那种测试工具进行的静态分析,我认为第2-4个例子,应该在编程规范中提及,避免此种情况的发生,因为此时的null pointer的存在使程序的可读性降低,而且在实际应用中容易引发别的错误。不过这几个例子不错。thanks.

5,177

社区成员

发帖
与我相关
我的任务
社区描述
软件工程/管理 质量管理/软件测试
功能测试压力测试安全性测试 个人社区 湖南省·长沙市
社区管理员
  • 软件测试
  • 虫无涯
  • 小博测试成长之路
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

欢迎大家加入到软件测试的社区,在这里,希望大家勇于发表自己的看法,欢迎大家分享自己在软件测试工作过程中遇到的问题以及工作经验分享。

1.想转行的小伙伴,遇到问题没有及时回复的,可以私聊小博进行反馈

2.大家对社区有好的建议,都可以在社区发帖进行反馈

推荐大家学习的软件测试入门笔记:软件测试入门学习笔记

试试用AI创作助手写篇文章吧