`
kmplayer
  • 浏览: 498222 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

防御性编程之三

阅读更多
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;
}
分享到:
评论

相关推荐

    防御性编程

    经典书籍,讲述防御性编程的方法和技巧,对嵌入式开发者较有帮助

    【善于防守-健壮代码的防御性编程技巧】--《编程匠艺》

    防御性编程:顾名思义,防御性编程是一种细致的,谨慎的编程方法。为了开发可靠的软件产品,我们要谨慎地设计系统的每个细节,便是其能尽可能的“保护”自己,,我们通过明确的代码中增加很多的假设,当假设在现实的...

    追求代码质量:用AOP进行防御性编程

    什么是边界情况呢?比方说,把null值传入一个并未编写如何处理null值的方法中,这就是一种边界情况。大多数开发人员通常都不能成功...尝试为应用程序整合进防御性编程、契约式设计和一种叫做OVal的易用的通用验证框架。

    safe-utils:防御性编程助手方法将改变您的生活

    简单的帮助程序方法,使您无需担心防御性编程即可访问属性。 这个软件包已经在Node.js和浏览器(React风格的应用程序)的生产环境中使用了大约4年,没有出现问题。 safeGet 用箭头函数包装您的访问器,并将其传递...

    主动防御源代码

    一份C++的源代码!! 系统主动防御源代码

    C++编程思想(第二卷)

    第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发

    C++编程思想之第2卷

    第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发...

    C++编程思想(Thinking in C++)完美版pdf

    第2章 防御性编程 第二部分 标准C++库 第3章 深入理解字符串 第4章 输入输出流 第5章 深入理解模板 第6章 通用算法 第7章 通用容器 第三部分 专题 第8章 运行时类型识别 第9章 多重继承 第10章 设计模式 第11章 并发...

    华为C&C++语言安全编程规范-V3.1

    前言 目的 本规范旨在加强编程人员在编程过程中的...3. 通过防御性的编码策略来弥补潜在的编码人员的疏忽 粗心是人类的天性。由于外部环境的不确定性,以及编 码人员的经验、习惯的差异,代码的执行过程很难达到完全

    ChemistrySyntaxChecker:一个简单的语法检查器项目,作为防御性编程的练习

    化学语法检查器一个简单的语法检查器项目,作为防御性编程的练习。 此语法检查器不会将元素名称与元素周期表匹配,而是设置有效化学语法的标准。 有效的化学元素的范围为 1 到 3 个字符,第一个字母大写,其余字母...

    C++编程思想(第2版 第2卷)

     第2章 防御性编程   2.1 断言   2.2 一个简单的单元测试框架   2.2.1 自动测试   2.2.2 TestSuite框架   2.2.3 测试套件   2.2.4 测试框架的源代码   2.3 调试技术   2.3.1 用于代码跟踪...

    C++编程思想--实用编程技术

    防御性编程 第二部分. 标准C++库 第3章. 深入理解字符串 第4章. 输入输出流 第5章. 深入理解模板 第6章. 通用算法 第7章. 通用容器 第三部分 专题 第8章. 运行时类型识别 第9章. 多重继承 第10章. 设计模式 第11章....

    PHP应用程序安全编程

    书名叫《PHP应用程序安全编程》,本书涵盖内容包括:Web应用程序安全的基础知识;从开始阶段设计安全的应用程序——去除已有应用程序的安全漏洞...解决第三方应用程序的已有漏洞;web应用程序的自动化测试工具和框架;

    verifier:包验证程序提供简单的防御性编程原语

    某些软件对可用性,安全性或安全性的要求比通常更高。 通常在此类项目中,人们会按照一组特定的规则练习务实的偏执狂。 例如:应用程序任何级别的每个公共函数都应检查传递给它的所有参数。 显然检查它所依赖的nil...

    socket编程实验报告1

    2.服务器只是一个py文件,稳定性还不够,可以给服务器配置数据库和本地文件来增加稳定性 3.服务器可能遭受各种攻击,可以给服务器增加一些安全和防御模块 4.服务

Global site tag (gtag.js) - Google Analytics