有关什么在BCB中选择CodeGuard

我:温哥华虫 来自:蒙特利尔虫网
本文来源http://www.szbug.com/disparticle.aspID=4

一、 为啥写那篇东西
团结在采用BCB5写一些程序时必要检讨很多东西,例如内部存款和储蓄器泄漏、财富是或不是有自由等等,在利用了许多工具后,发觉BCB五笔者自带的工具–CodeGuard,卓殊不利,使用也挺方便的,但是摸索了很久(以及翻查了壹些素材,包罗HELP)才算是会用了。写那篇小说的目标希望有那地点的题指标情侣能够借鉴一下,我们相互学习,共同升高。作者的联系方法:Email:szbug@szbug.com,希望志同道合的对象来信相互调换。以下这篇小说算是拼凑出来的一篇小说,壹些材质是在书上找的,一些是在HELP上见到了。首先注脚自个儿的语文及德语水平十一分零星,有写错依旧翻译错的地点,还望给位提议。尤其多谢XX的柔情帮本人查对……
二、 什么是CodeGuard
CodeGuard是在是C++Builder5才出现的3个工具。CodeGuard是C++Builder中一个主次在运作时代的检查器,用于检查内部存款和储蓄器依旧财富的使用,以及函数调用的注解。
CodeGuard能够检查实验到以下的程序运维期错误:
私下的内部存款和储蓄器释放。
无效的句柄可能文件流。
私行指针。
运用已被释放的指针。
内部存款和储蓄器泄漏。
分配但结尾未有自由的内部存款和储蓄器变量。
传递给函数的不得法的参数(包蕴VCL以及Win3贰函数)。
函数重回值的错误。(包罗VCL以及Win32函数)。
比如:在应用程序中准备数次获释相同的财富(只怕曾经刑释了的能源)、试图访问已经被放走的内存。
三、 在BCB5中哪些利用CodeGuard–配置CodeGuard
只要要使用CodeGuard的话,必须有个别代码编译进你的应用程序,所以在变更以下这一个设置后。必须全方位再度编写翻译(切记切记!!!)。第贰、打开应用程序的工程选项的CodeGuard页框,把CodeGuard
Validation后面打勾(见图1)。

如图1所示,工程选项里,还有别的多少个选项。第一个选项允许CodeGuard检查指向局地、全局和静态变量的不算指针和数量溢出。第三个选用允许CodeGuard检查评定对地下的(无效的、已去除的)对象的方法的调用。第多个挑选允许CodeGuard验证内嵌指针的造访(在某个材质上说,开启这几个选项会导致程序执行速度变得一点也不快,小编测试过了,假设工程不是十分的大的话不是很显著,还不错。)1般的调节和测试是开打全体的选料(暗许选项也是总体开辟)。
经过CodeGuard的安顿工具,能够安插CodeGuard的有的选用,在命令行情势执行CGCONFIG.EXE。能够看到三个对话框(图二)
如图贰所示,Preferences标签页用于安装CodeGuard那一个工具的大局选项。Enable选项能够在应用程序不另行编写翻译的情形下使用恐怕不利用CodeGuard,1般的话是都以启用她。若是选取CodeGuard的话,建议安装工程选项来禁止或许应用CodeGuard。Stack
fill frequency填充栈频率是检验对运营期栈的失效访问。Report和Error
Message
Box选项是安装CodeGuard报告错误的不二等秘书籍。在Report里,Stiatistics选项打开CodeGuard输出分配和刑满释放解除劳教内部存款和储蓄器的总结表、被采纳的Win3二API的调用、财富的使用景况,并在日记文件中增进二个模块列表,以便检查错误。Resource
Leaks选项是告诉CodeGuard在应用程序甘休后告诉财富泄漏的图景。选定了Error
Message
Box选项后,当应用程序不在IDE里运行时,要是CodeGuard检验到错误音讯,那么将使用三个对话框的章程告知使用者。别的选项壹般不常用,能够参见C++Builder的同台HELP。
CodeGuard配置工具中的Resource Options和Function
Options页框允许用户对应用程序的能源、文件和函数调用设置各类跟踪选项。除非非凡的因由要求改变默许的配置,不然使用缺省的设定就行了。Function
Options页上有七个相比较常用的选项就是记录3个一定函数的历次调用情状。
Ignored
Modules页框允许你告诉CodeGuard,当检查评定的时候可以忽略一些运转期的错误(1般是指有些DLL可能包)。这几个选项1般不常用。
四、 使用CodeGuard
应用CodeGuard其实非常的粗略,只要像在此以前那样布置了CodeGuard,然后运转你的应用程序,无论你的应用程序是或不是在IDE中运转,CodeGuard都将会依照CodeGuard配置的选项监视你的应用程序。同时,他还会向三个日志文件里输出全数的音讯(文件存放在您的工程所在目录中,文件名和工程名相同,扩张名称为.cgl)。例如你的工程名叫C:WordTest.prg,那么CodeGuard的日志文件为C:WordTest.cgl,它是三个文书文件,可以用任何的公文编辑器来编排它。
在IDE中,能够通过<菜单>View->Debug Window->CodeGuard
Log来查看CodeGuard的日志文件(或许用快捷键Ctrl+Atl+O)。
要是您的次第在运营是出新属于CodeGuard监视的荒谬的时候,CodeGuard会把它输出到CodeGuard
Log中。并将错误消息用壹颗”树”的秘籍体现(使用很便宜,就好像使用Windows的能源管理器一样简单)。每一个错误都足以开始展览,以展现某种错误类型所特有的壹些音信。例如:二个能源丰盛地点使用了、分配以及释放;发生错误时的栈音信;并且提出了失误的代码行。那样就可以飞快的找到错误的源于!

CodeGuard
Log(图三)窗口上有四个按钮Stop和Clear。当Stop选中的时候,假使那年程序遭遇了不当,CodeGuard将告1段落应用程序。假设未选中,那么程序即便遇到了错误也会继续,这样能够运作三回记录很多错误音讯。当Clear选中的时候,应用程序每回重复运转将清空日志中的音讯。
在CodeGuard
Log窗口中,双击单个错误的节点的时候,如若存在源代码的话,IDE窗口会活动跳到那一行代码上。尽管不存在源代码的话,则显示CPU窗口。图3中,出现的失实是财富泄漏。当你的鼠标双击Tform一:Button壹Click那一行的时候,会自行跳到源代码中冒出谬误的那壹行。
当CodeGuard检查实验到二个张冠李戴的时候,并找到出现难题的源代码时,剩下的工作正是1旦改正你的代码。这几个进度能够同盟监视和数量断点来兑现,效果越来越好!
伍、 CodeGuard中的错误以及原因(那1章由于个人的水平有限,难免漏、错)
CodeGuard能够检查实验到许多运维期的失实!常常很不难就足以从CodeGuard的意思找出荒谬的根源。对于多数的谬误,CodeGuard壹般会显得的回顾:发生错误的地点、能源分配、财富自由、能源被分配以及被访问字节数。

  1. Access In Freed Memory
    如若内存被放走了,在前面还一而再走访,就会发出这一个张冠李戴。在C/C++中,经常使用new或然malloc分配内部存款和储蓄器,用delete和free释放。以下是二个做客了被假释的内部存储器的例证:
    void foo()
    {
    TMyClass *MyClass = new TMyClass();
    delete MyClass;
    MyClass->xxxx = 10; //MyClass已经被放飞了
    }
    CodeGuard会报告已被保释的内部存款和储蓄器在何处被访问,内部存款和储蓄器原来被分配的地点以及内设有哪个地方被放走的。
  2. Method Called On Freed Object
    本条荒唐前面贰个不当类似。起因是由于调用了已被保释的靶子的章程而不是造访已被放出的内部存款和储蓄器!
    void foo()
    {
    TMyClass *MyClass = new TMyClass();
    delete MyClass;
    MyClass->xxxx (10);
    }
    CodeGuard将突显在哪儿调用了已出狱对象的方式,对象被创建的地方以及对象被保释的地点。
  3. Reference To Freed Resource
    在程序中准备数十次(一次以上)释放同贰个能源,CodeGuard将检查评定到这几个荒唐,有几许种方法都会时有产生那个错误!例如:
    void foo()
    {
    TMyClass *MyClass = new TMyClass();
    delete MyClass;
    delete MyClass;
    }
    CodeGuard将告诉财富在何处第二遍被假释,从而挑起那个荒唐的。还会报告财富在何地分配,在何方第3遍释放。
  4. Method Called On Illegally Casted Object
    要是在程序中对有效的内部存款和储蓄器范围之外的章程的调用将会引起那些荒唐。
    void foo()
    {
    TMyClass *MyClass = new TMyClass[5];
    MyClass[5].xxxx(); //No such MyClass[5]
    delete []MyClass;
    }
    CodeGuard将告诉对象调用的方式定义的地方,以及那一个点子被调用的地点以及对象大概内部存储器被分配地点。
  5. Resource Type Mismatch
    壹经在先后中释放财富和定义(分配)时候不同,会产出那么些张冠李戴。
    void foo()
    {
    TMyClass *MyClass = new TMyClass[2];
    delete MyClass; //Code1
    TMyClass *MyClass = new TMyClass();
    delete []MyClass; //Code2
    }
    在Code一以及Code2都会吸引Resource Type
    Mismatch错误,CodeGuard将会告诉财富在何处以不平等的方式被放走,以及财富是在何地被分配的地点。
  6. Access Overrun
    当访问违规内部存款和储蓄器区域的内部存款和储蓄器时会造成那一个荒唐(所访问的内部存款和储蓄器在法定内部存款和储蓄器区域之后),经常状态下是数组下标引用超出原来定义的。
    void foo()
    {
    TMyClass *MyClass = new TMyClass[2];
    MyClass[2].abc = 10; //No such MyClass[2]
    delete [] MyClass;

char *ch = new char[5];
strcpy(ch, “123456”); //Error
delete []ch;
}
CodeGuard报告出错的地点,财富在何地分配的。

  1. Access Underrun
    当访问非法内部存款和储蓄器区域的内部存款和储蓄器时会导致这么些荒唐(所走访的内设有法定内存区域此前)。
    void foo()
    {
    TMyClass *MyClass = new TMyClass[2];
    MyClass[-1].abc = 10; //No such MyClass[2]
    delete [] MyClass;
    }
    CodeGuard报告出错的地点,财富在哪里分配的。
  2. Uninitialized Stack Accessing
    走访栈中为被早先化的区域将会导致这些指鹿为马。
    void foo1(int **Ptr)
    {
    int Var;
    *Ptr = &Var;
    }
    void foo()
    {
    int *Ptr;
    foo1(&Ptr);
    *Ptr = 100;
    }
    CodeGuard将会告知何处访问还向来不被起初化的栈。
  3. Access In Invalid Stack
    当在先后中尝试访问栈底部的内部存款和储蓄器的时候现身那么些指鹿为马!
    void foo()
    {
    char str[20];
    strcpy(&str[-1], “szbug”);
    }
    CodeGuard报告爆发错误的地点。
  4. Bad Parameter
    本条荒唐平日是出现无效的文件或然其它能源句柄作为参数字传送递给VCL可能Win3二API函数时爆发的。
    Void foo()
    {
    FILE *Stream;
    wwwlehu6.vip乐虎官网,fclose(Stream);
    }
    CodeGuard将告诉采纳了不得法参数的函数在何处被调用。
  5. Function Failure
    这一个荒唐是CodeGuard在破获VCL以及Win3二API函数的重临值假如现身谬误时引发的。
    viod foo()
    {
    CopyFile(“abc.txt”, “acbd.txt”, true);
    //借使那一个函数由于某种原因败北了,
    //那么CodeGuard将会捕获并报告Function Failure错误!
    }
  6. Resource Leak
    即使在先后中财富(包涵Winwos资源,内部存款和储蓄器能源等等),分配了,在先后的尾声没有自由!将吸引Resource
    Leak错误。
    Void foo()
    {
    char *ch = new char[10];
    }
    CodeGuard将告诉财富创建的地点,以及所泄漏的字节数。
    六、
    CodeGuard还足以检验到应用程序的许多错误,那里只说说有的广大的不当,别的的荒唐和例子请参见C++Builder的HELP。希望大家经过CodeGuard找出程序中的错误以及Bug!!!希望大家的先后尤其健全,越来越稳定。。。呵呵

http://www.cnblogs.com/-clq/archive/2011/12/28/2304823.html

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图