1,一个常用的宏,用于输出正在执行的语句.
#define TEACE(ARG) cout<<#ARG<<endl; ARG
2,一个跟踪new动态分配内存的程序
#include <cstdio>
#include <cstddef>
#include <cstdlib>
#include <cassert>
using namespace std;
bool traceFlag=true; //标识是否跟踪动态信息
namespace{
struct Info //保存跟踪信息
{
void* ptr; //地址
const char* file;//文件名
long line; //行号
};
const size_t MAXPTRS=10000u; //最多可以分配的地址数
Info memMap[MAXPTRS];
size_t nptrs=0; //已经分配的地址数
int findPtr(void* p) //返回地址的位置
{
for(size_t i=0;i<nptrs;i++)
if(memMap[i].ptr==p)
return i;
return -1;
}
void deletePtr(void* p) //回收这个地址
{
int pos=findPtr(p);
assert(pos>=0);
for(size_t i=pos;i<nptrs-1;i++)
memMap[i]=memMap[i+1];
nptrs--;
}
struct Report //利用全局对象的析构函数,输出最后的测试结果
{
~Report()
{
if(nptrs>0)
{
printf("Leaked memory at:\n");
for(size_t i=0;i<nptrs;i++)
printf("%p file:%s,line:%ld\n",memMap[i].ptr,memMap[i].file,memMap[i].line);
}
else
printf("No memory Leaks.\n");
}
};
Report r; //全局对象
} //这里没有分号
void* operator new(std::size_t sz, const char* file, long line)
{
void* p=malloc(sz);
if(nptrs==MAXPTRS)
{
printf("No enougth space!\n");
exit(1);
}
memMap[nptrs].ptr=p;
memMap[nptrs].file=file;
memMap[nptrs].line=line;
nptrs++;
if(traceFlag) //输出跟踪信息
printf("Allocated %u bytes at address %p,file: %s,line: %ld\n",sz,p,file,line);
return p;
}
void* operator new[](std::size_t sz, const char* file, long line)
{
return operator new(sz, file, line);
}
void operator delete(void* p)
{
if(findPtr(p)>=0)
{
free(p);
assert(nptrs>0);
deletePtr(p);
if(traceFlag) //输出跟踪信息
printf("Delete memoey at address %p\n",p);
}
else if(p)
printf("Attempt to delete unknown pointer:%p\n",p);
}
void operator delete[](void* p)
{
operator delete(p);
}
#define TRACE_ON() traceFlag=true;
#define TRACE_OFF() traceFlag=false;
int main()
{
//TRACE_OFF();
int* p=(int*)operator new(3,__FILE__,__LINE__);
operator delete(p);
int* p2;
operator delete(p2);
return 0;
}
分享到:
相关推荐
经典书籍,讲述防御性编程的方法和技巧,对嵌入式开发者较有帮助
防御性编程:顾名思义,防御性编程是一种细致的,谨慎的编程方法。为了开发可靠的软件产品,我们要谨慎地设计系统的每个细节,便是其能尽可能的“保护”自己,,我们通过明确的代码中增加很多的假设,当假设在现实的...
什么是边界情况呢?比方说,把null值传入一个并未编写如何处理null值的方法中,这就是一种边界情况。大多数开发人员通常都不能成功...尝试为应用程序整合进防御性编程、契约式设计和一种叫做OVal的易用的通用验证框架。
简单的帮助程序方法,使您无需担心防御性编程即可访问属性。 这个软件包已经在Node.js和浏览器(React风格的应用程序)的生产环境中使用了大约4年,没有出现问题。 safeGet 用箭头函数包装您的访问器,并将其传递...
一份C++的源代码!! 系统主动防御源代码
第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发
第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发...
第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发...
前言 目的 本规范旨在加强编程人员在编程过程中的...3. 通过防御性的编码策略来弥补潜在的编码人员的疏忽 粗心是人类的天性。由于外部环境的不确定性,以及编 码人员的经验、习惯的差异,代码的执行过程很难达到完全
化学语法检查器一个简单的语法检查器项目,作为防御性编程的练习。 此语法检查器不会将元素名称与元素周期表匹配,而是设置有效化学语法的标准。 有效的化学元素的范围为 1 到 3 个字符,第一个字母大写,其余字母...
第2章 防御性编程 2.1 断言 2.2 一个简单的单元测试框架 2.2.1 自动测试 2.2.2 TestSuite框架 2.2.3 测试套件 2.2.4 测试框架的源代码 2.3 调试技术 2.3.1 用于代码跟踪...
防御性编程 第二部分. 标准C++库 第3章. 深入理解字符串 第4章. 输入输出流 第5章. 深入理解模板 第6章. 通用算法 第7章. 通用容器 第三部分 专题 第8章. 运行时类型识别 第9章. 多重继承 第10章. 设计模式 第11章....
书名叫《PHP应用程序安全编程》,本书涵盖内容包括:Web应用程序安全的基础知识;从开始阶段设计安全的应用程序——去除已有应用程序的安全漏洞...解决第三方应用程序的已有漏洞;web应用程序的自动化测试工具和框架;
某些软件对可用性,安全性或安全性的要求比通常更高。 通常在此类项目中,人们会按照一组特定的规则练习务实的偏执狂。 例如:应用程序任何级别的每个公共函数都应检查传递给它的所有参数。 显然检查它所依赖的nil...
2.服务器只是一个py文件,稳定性还不够,可以给服务器配置数据库和本地文件来增加稳定性 3.服务器可能遭受各种攻击,可以给服务器增加一些安全和防御模块 4.服务