精华内容
下载资源
问答
  • 程序分析技术

    千次阅读 2016-10-29 16:19:53
    程序分析方法。程序分析是程序设计的一个发展方向,是程序员提升能力的有效途径。

    1.程序分析技术概述

    编程是大学阶段必须掌握的生存能力,过程式语言到面向对象技术的c++,到java语言。Java语言最早是为电子产品创建的新语言,因此可移植性好,不需要对内存进行干涉,因此没有指针的功能。面向对象技术经过C++语言的多线程多核的发展后,在hadoopnoSQL的数据分析技术成为最近几年云计算的支持技术的IT界,开始有些逊色于函数式语言、R语言和Python

    一个好的程序员在计算机软件界,不仅脚踏实地掌握高超的编程能力,在工作实践中应用数据结构实现高质量程序和选择好的算法提高程序效率,在项目开发的软件工程中对总体设计、详细设计和软件测试能熟练掌握和应用,而且有必要掌握程序分析技术。

    在编译技术、程序调试、程序测试和并行程序设计的范围中,程序分析技术包括对源程序进行程序路径、循环语句分析方法,以及变量的数据流和程序的控制流分析方法。程序路径分析有静态路径分析和动态路径分析,应用编译技术的DAG图和CFG;而循环语句分析有循环语句执行次数和循环终止条件分析。数据流和控制流根据du链和ud链可发现数据依赖。主循环展开也属于编译技术。

    程序切片因关注一个问题而产生,例如发现一个变量的错误位置,在语句级分析的层次上依靠程序点n的相关语句间的控制依赖和变量间的数据依赖,而且更关注语句控制依赖的相关度,类似软件工程的控制内聚和数据内聚。设置程序点n要求它的相关语句与其它兴趣点控制范围相对无关。切片标准(slicing criterion)是程序点n的变量值类似希尔排序,而软件工程的功能内聚则像快速排序。程序切片技术常用在程序调试和程序测试。在并行程序设计中,可应用程序分析和程序切片技术,将程序合理地分成并行计算程序块,根据数据相关性完成数据分配。掌握数据相关性和数据依赖,对hadoop编程有帮助。

    实际上,程序分析技术并不陌生,程序流程图和发现语句错误的debug都是程序分析技术。程序分析技术的应用和为了进一步发展而掌握的技术有很多,例如源程序的功能主题发现,用到编辑距离,在互联网文件中应用广泛;在面向对象技术中,应掌握语义操作和构件,属于软件工程的功能内聚,是软件复用的基础;部分求值技术是输入数据驱动的程序分析方法,可在软件测试中应用,而且在程序运行时间上能根据不同输入数据的执行时间,分析程序的运行时间和时间复杂度;基本块传递函数尽管是编译技术,但是对程序功能和变量的数据分析有用。

    因此,程序分析技术是IT界程序员应该掌握的技术,即使有些困难,但是应用在实践中,收获将有很多。下面将用4~5篇文章介绍给大家。

    2.程序路径分析

    程序路径是程序的第一个语句到生成数据输出的所谓“出口”的语句序列。现代高级语言的结构程序有多个出口,这是控制语句决定。程序有多条路径,这是控制语句和循环语句决定的。分析程序路径的例题。

    2.1 数据分析

    eg1.取三个数x1,x2,x3的中间数

    double GetMid(double x1, double x2, double x3)

    {

     double mid=x3;

     if(x2<x3){  //1if语句

       if(x1<x2)   //第二个if语句

          mid=x2;  

       else{        //第二个if语句的else语句,从{}可知。

          if(x1<x3)  //第三个if语句

            mid=x1;

            }

      }else    //第一个if语句的else语句

    if(x1>x2)   //第四个if语句

            mid=x2;

         else      //第四个if语句的else语句

    ,      if(x1>x3)  //第五个if语句

              mid=x1;

      return mid;               

    }

    程序阅读是掌握程序功能的方法,数据分析技术可准确分析例题1的功能。数据分析技术首先看输出。return mid返回的mid,则是程序的输出数据。因此,将mid作为一列。其次看输入数据,函数GetMid的参数有x1,x2,x3,则都作为一列。根据第一个语句mid=x3,则有

                  x1               x2               x3               mid

                                                                            x3

    而根据第一到第五个if语句,有

              mid               x1                x2                x3   

               x3                                                                       B1(第一个语句记为B1)

                                                       x2<x3                         if1(第一个if语句)

               x2                x1<x2                                            if2(第二个if语句)

                                                                                         第一个程序路径B1->if1->if2

               x1               (x1>x2)                                          else2(第二个if语句的else语句)

                                   x1<x3                                            if3(第三个if语句)

                                                                                         第二个程序路径B1->if1->else2->if3

                                                     (x2>x3)                       else1(第一个if语句的else语句)

               x2                x1>x2                                            if4(第四个if语句)

                                                                                        第三个程序路径B1->else1->if4

                                   (x1<x2)                                        else4(第四个if语句的else语句)

               x1                x1>x3                                          if5(第五个if语句)

                                                                                       第四个程序路径B1->else1->else4->if5

                                                                                       第五个程序路径B1.              

    在以上分析可知,在三个数中取中间数程序有5个路径。         

    2.2 程序路径静态分析  

        GetMid()每一个语句进行了层次标注,而多个相邻赋值语句则标注为语句块B程序的输入数据集合用{x1,x2,x3}表示。对每个if语句的输入数据集合,则在注释中表示

    eg1.1 取三个数的中间数

    double GetMid(double x1, double x2, double x3)

    {

     double mid=x3;//B1

     if(x2<x3){// if1  {x1,(x2,x3)}={<x1,x2,x3>,< x2, x1, x3>,< x2, x3, x1>}

       if(x1<x2)// if2划分等价类<x1,x2,x3>

          mid=x2;  //path1:< x1, x2, x3>

       else{// else2    {< x2, x1, x3>,< x2, x3, x1>}

          if(x1<x3)// if3划分等价类<x2,x1,x3>

            mid=x1;  //path2:< x2, x1, x3>

            }

      }else // else1 {x1,(x3,x2)}={ < x1, x3, x2>,< x3, x1, x2>,< x3, x2, x1>}

    if(x1>x2)// if21

            mid=x2; //path3:< x3, x2, x1>

         else // else21    { < x1, x3, x2>,< x3, x1, x2>}

    ,      if(x1>x3)// if31

              mid=x1;// path4:< x3, x1, x2>

      return mid; //L_OUT[if_elseB]

                // path5=[x3]<R>,mid=x3

    }

    程序的数据集合分析:

    L_IN[B1]= A={ x1, x2, x3}

    L_OUT[B1]={A}  //mid=x3

    L_IN[if1]={ x1, x2, x3}

      L_OUT[if1]=(x2, x3)  //(x2, x3)是有序集

      L_IN[if2]={< x1, x2, x3>,< x2, x1, x3>,< x2, x3, x1>}

    L_OUT[if2]=< x1, x2, x3>   //path1=< x1, x2, x3>,mid=x2

    L_IN[else2]={< x2, x1, x3>,< x2, x3, x1>}=L_OUT[else2]≠L_OUT[if2]

    L_IN[if3]= L_IN[else2]={< x2, x1, x3>,< x2, x3, x1>}

    L_OUT[if3]= < x2, x1, x3>  //path2=< x2, x1, x3>,mid=x1

    L_IN[else1]=( x3, x2)= L_OUT[else1]

    L_IN[if21]= {< x1, x3, x2>,< x3, x1, x2>,< x3, x2, x1>}

    L_OUT[if21]= < x3, x2, x1>   //path3=< x3, x2, x1>,mid=x2

    L_IN[else21]= {< x1, x3, x2>,< x3, x1, x2>}

    L_IN[if31]= L_OUT[else21]= {< x1, x3, x2>,< x3, x1, x2>}

    L_OUT[if31]= < x3, x1, x2>      //path4=< x3, x1, x2>,mid=x1

    L_OUT[if_elseB]={ < x1, x3, x2>,< x2, x3, x1>} //path5=[x3]<R>,mid=x3

    parA={< x1, x2, x3>,< x2, x1, x3>,< x3, x2, x1>,< x3, x1, x2>,[x3]<R>}.因为parA=A,所以程序正确。

    if_elseB并不是真实存在的语句,是第一层if语句的else条件语句块。

     

    展开全文
  • 程序设计方法和程序分析

    千次阅读 2017-08-16 13:26:50
    程序设计方法和程序分析是两个不同范围应用的技术。 程序设计方法是提高程序效率和确保程序正确性而产生的软件理论。经过战胜软件危机,丰富深刻的设计方法的出现,越来越多的应用编程,程序员和编程爱好者建立了...

    1.概述

     

    程序设计方法和程序分析是两个不同范围应用的技术。

    程序设计方法是提高程序效率和确保程序正确性而产生的软件理论。经过战胜软件危机,丰富深刻的设计方法的出现,越来越多的应用编程,程序员和编程爱好者建立了程序设计方法学。

    而程序分析是发现程序设计方法不能阻止的程序错误和程序缺陷而发展的。程序分析对已有程序的执行次数、程序路径、变量值进行分析。

     

    程序效率表示程序的性能,人们用算法复杂度表示--理论上的运行时间和运行所需存储空间,包括程序地址空间和系统栈空间。程序正确性引导程序开发过程,则形成程序的形式推导方法。正确性的程序经过正确的程序变换规则生成的程序也是正确的。程序正确性能引导程序开发过程。Floyd-Hoare规范公理用短小精悍的不等式、数学表达式和逻辑运算符表示前断言P和计算语句结果的后断言Q,控制条件B划分为{B,-B}成为条件语句P或循环语句Q的一部分。验证的形式是规则前提和结论的分式形式。

        程序效率在结构程序设计上,表现的特征是单入口和单出口的相对独立的控制语句,因此循环语句可视为单路径而if-else条件语句则是双路径;程序正确性则表现为程序具体结构和内部逻辑的良型控制结构。过程则对时间一定有要求。Unix/Linux系统的并发程序或多核多线程必须处理程序实体在执行时间上的严格性要求,所以应建立进程(线程)调度的合乎运行机制的时间序列,以防止死锁、进程实际饥饿和资源消耗。程序效率则表现在进程控制语句fork()、waitpid()、signal()、exit()、ftok()和msgget()等对进程创建和执行时间与进程间关系的精确控制和进程存储空间的管理,程序正确性则是并发程序能遵循进程(线程)调度和执行的全部正确性原则。

    程序效率在面向对象技术上,表现的特征是类、模板封装的内聚性和实现的独立性,而且实例化和类对象的存储管理也是特征。而效率的另一个特征是软件复用,类库与过程式函数库调用复用相似,STL的容器和模板的实参具有数据类型的通用方式的实例复用,类层次的继承是软件复用的进化。此外,多态是函数参数数据类型的多种形式的要求,可认为是currying技术的应用[4]。程序正确性在面向对象技术中的应用表现在四个方面:(1)设置访问控制,类、继承和友元的访问权限,(2)独立设计方法:类的接口与实现分离、虚拟函数与继承实现、模板定义与实例化、容器与元素实参数据类型(并不熟练)(3)管理存储单元:静态成员、对象、容器、多继承,防止资源重复删除和悬挂指针。(4)最后是系统自动调用的机制。系统自动调用创建、复制构造、赋值、移动、析构操作和实现默认类操作,防止对类和对象的活动期管理出现漏洞。

    Backus在1977年的图灵奖颁奖典礼上发表的演讲提出函数式FR程序设计。用无变量的原始函数的递推公式定义、函数组合和泛函型的方法编程,主要使用递推公式映射的递归方式,程序代数可实现FR推导。现代函数式程序的效率表现在用运行时系统的图规约表示高阶函数和惰性计算。程序正确性表现在可计算函数和数学泛函型的正确性上。FR函数程序设计反应了输入数据和输出数据间的关系(Relation),也可用传递函数实现,因此前后断言和谓词转换器能证明程序正确性。但是Relation不是流程,而是组成程序执行过程的操作有序组。

    Lisp和prolog是人工智能推出的逻辑式程序设计,是在解空间事实和规则的子句列表推理执行(寻找与合一)“新”事实的方法。实际上,逻辑式程序设计中的关系,并不是高阶函数或者传递函数,而是多个项间的关系或约束。

     

        编译原理使用程序分析方法,包括控制流、数据流、符号分析,目的是发现控制流走向,优化程序,产生目标代码,以及分析并行成分。

    程序设计方法和程序分析的关键技术有:(1)实例化,原因是程序分析中数据与变量的相对独立性,程序设计方法中类型与类型名的独立性,操作对象与具体数据结构实现的相对独立性。(2)映射,包括数据类型的数据实例化,C++的map类,类模板实参,多态函数在运行时绑定,甚至包括递归程序的取样规则和展开规则,而程序变换的等价模式有序对也可看作映射,尽管需要程序变换规则。(3)软件复用,库函数、封装、模板和容器、数据结构的通用算法。

    程序设计方法和程序分析关键技术见表1,分类表目包括1和2类,分别是程序设计方法和程序分析两种类型。

    表1  程序设计方法和程序分析的关键技术

     

    功能需求

    程序执行过程

    构造基础

    理论基础

    分类

    程序形式推导

    不变式,界函数,一阶谓词

     

    语句,面向目标。

    最弱前置条件

    1

    函数式程序

    无变量函数定义与组合型

    图规约

    语句,函数与泛函型

    程序变换和程序代数

    1

    程序变换

    程序形式规范

     

    一阶谓词与函数定义

    程序变换规则

    1

    ADT

    代数规范(操作)

    公理用作程序

    类(class)

    抽象代数

    1

    符号执行

     

    符号执行树

    路径约束

    程序形式推导

    2

    部分值求解

    静态精确公式,动态转换系统*

    程序例化器

    程序、输入数据,例化程序

    程序转换与程序例化。s-m-n理论

    2

    控制流图

    CFG*

     

    基本块

    编译原理

    2

    数据流图

    DFG*

     

    变量依赖

    编译原理

    2

    程序切片

    FG,PDG,SDG*

     

    语句,可达

    信息流和路径例化

    2

    Floy-Hoare

    {P}S{R}

    前后断言

    语句,上下文

    规则与证明

    1

    最弱前置条件

    wp(“S”,R)

     

    语句,谓词转换器

    谓词语义

    1

    程序测试

    路径,循环*

    测试用例

     

     

    1,2

        在表1可知,程序的功能需求表示在程序设计中,用程序形式规范,实质是一阶谓词(若不包括程序分析中的程序结构方式*),Floyd-Hore规则逻辑和wp(“S”,R)谓词转换器的实质也是一阶谓词或者功能相似的数学表达式。另一种表示形式是代数规范或者泛函数型。因此对程序功能的表示是不足的,谓词和不等式并不能刻画程序功能的实质。程序功能是表示程序对数据的操作,例如复制移动、计算、排序、路径节点的集合扩展,以及数据间的逻辑关系,例如follow集、first集、R[com]算法的计算关系、数量大小关系和路径关系,实现程序的外在功能。

    

    展开全文
  • 程序分析器有静态分析器和动态分析器之分。 咱们常用的编辑软件,如SourceInsight,notepad++,UE等都或多或少有程序分析的功能,他能知道哪些是函数接口,哪些是全局变量,哪些是局部变量等等。 pclint就是咱们...

    引言

    程序分析器有静态分析器和动态分析器之分。

    咱们常用的编辑软件,如SourceInsight,notepad++,UE等都或多或少有程序分析的功能,他能知道哪些是函数接口,哪些是全局变量,哪些是局部变量等等。

    pclint就是咱们常用的稍微专业点的静态代码检查工具了,再专业点的比如Testbed等。

    相对于静态代码检查工具,动态代码分析工具就更专业一点了,可以分析二进制代码的详细的属性,比如instruction mix,call graph,memory leak等等。

    pin最常用,有intel公司维护,提供丰富API,不提供source。

    valgrind是开源的,我喜欢,呵呵。


    2.1 安装步骤


    1》下载最新源码包

    http://valgrind.org/


    2》解包

    tar -xjvf valgrind-3.8.1.tar.bz2


    3》安装

    cd valgrind-3.8.1

    ./configure

    make

    make install


    2.2 编写待分析代码:rill.c

    #include <stdio.h>
    
    int main(void)
    {
    printf("hello rill\n");
    return 0;
    }


    2.3 编译生成可执行文件rill

    gcc -g rill.c -O0 -o rill


    2.4 分析

    valgrind --leak-check=yes rill 


    2.5 分析结果




    展开全文
  • 编译程序分析源程序的阶段依次

    千次阅读 2016-10-30 21:08:56
    编译程序分析源程序的阶段依次是( ) A.词法分析、语法分析、语义分析 B.语法分析、词法分析、语义分析 C.语义分析、语法分析、词法分析 D.语义分析、词法分析、语法分析 试题答案:A
    编译程序分析源程序的阶段依次是( )
    

    A.词法分析、语法分析、语义分析  B.语法分析、词法分析、语义分析
    C.语义分析、语法分析、词法分析  D.语义分析、词法分析、语法分析
    试题答案:A
    展开全文
  • 程序分析工具gprof

    千次阅读 2011-12-20 12:39:19
    程序分析工具gprof介绍 程序分析是以某种语言书写的程序为对象,对其内部的运作流程进行分析。程序分析的目的主要有三点:一是通过程序内部各个模块之间的调用关系,整体上把握程序的运行流程,从而更好地理解程序...
  • 程序分析工具gprof介绍

    千次阅读 2007-03-19 23:18:00
    程序分析是以某种语言书写的程序为对象,对其内部的运作流程进行分析。程序分析的目的主要有三点:一是通过程序内部各个模块之间的调用关系,整体上把握程序的运行流程,从而更好地理解程序,从中汲取有价值的内容。...
  • BAP——一个二进制程序分析平台

    千次阅读 2017-12-13 11:32:13
    BAP是一个编写程序分析工具的框架,它的特点和优势如下: 针对二进制程序 用Ocaml编写,提供了C, Python, Rust等语言接口 工作流程为 二进制程序-&gt;汇编指令-&gt;BIL/BIR中间表达-&gt;利用BAP插件或...
  • 前面已经介绍创建分析树,下面就来详细地说明一个例子,看看到底生成什么样的分析树,C源程序如下:#005 int nTest1 = 1;#006 int nTest2 = 2;... 把上面的源程序分析后,就生成下面的DAG树,如下:#
  • 最近的南大软件分析课,讲的就完全是静态分析的内容,目前先...理论部分:语言设计、类型系统、形式语义和程序逻辑等。即在理论上构建出一个语言。 环境部分:编译、运行时系统等。即相应的支撑语言运行的一套系统...
  • 请教各位大神,如何在web容器中(如tomcat)来调用spark程序啊,网上看到的都是自己把程序生成jar包,然后调用spark-submit来执行!!
  • 程序分析实例 - 无双大蛇(Orochi)

    千次阅读 2008-03-26 10:08:00
    下面以对KOEI的无双大蛇的一个bug的研究为例,介绍程序分析的基本方法。无双大蛇是KOEI公司推出的一款动作类游戏,3.20日发布了日文PC版。在游戏过程中发现,进入某些战斗的时候程序会陷入死循环,具体表现是在菜单...
  • InstancePtr->Config->HandlerTable[Int_Id].Handler = Handler; // 即参数SW_intr_Handler InstancePtr->Config->HandlerTable[Int_Id].CallBackRef = CallBackRef;// 即参数1
  • //【程序32】 Ex32.java 题目... 程序分析:可以这样考虑: import javax.swing.JOptionPane; public class Ex32App { /** * @param args */ public static void main(String[] args) { // TODO Auto-gener
  • //【程序21】TestJieCheng.java ...程序分析:此程序只是把累加变成了累乘。 public class TestJieChengApp { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated meth
  • Android 应用程序分析之Settings

    万次阅读 2010-11-04 11:55:00
    由于需要修改Setting默认设定的需要,需要分析下Setting的源码,以及数据存储与读取。 Android自带的应用程序存储在packages/apps目录下 主要目录和文件如下: 其中resouce是资源文件,src是源代码,tests中含有测试...
  • PL/0语言编译程序分析

    千次阅读 2006-12-01 00:50:00
    PL/0语言是Pascal语言的一个子集,我们这里分析的PL/0的编译程序包括了对PL/0语言源程序进行分析处理、编译生成类PCODE代码,并在虚拟机上解释运行生成的类PCODE代码的功能。 PL/0语言编译程序采用以语法分析为核心...
  • //【程序6】Test1.java GcdTest.java后者是辗转相除法 题目: ...程序分析:利用辗除法。 public class GcdTestApp { /** * @param args */ public static void main(String args[]){ valuePrint vp=n
  • 程序分析:分行与列考虑,共9行9列,i控制行,j控制列。 public class NineApp { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub Nine n
  • 程序分析:利用双重for循环控制输入二维数组, //再将a[i][i]累加后输出。 public class TestAdd3App { /** * @param args */ public static void main(String[] args) { // TODO Auto-ge
  • LCC编译器的源程序分析(1)C编译器的目标

    万次阅读 热门讨论 2007-05-07 20:01:00
    先从简单的目标来分析这个大规模的C编译器,毕竟它的功能比较复杂,并且源程序的行数也是非常多的。因此,把简单的目标定出来,然后再分析它,这样才会有的放矢。接着再跟着编译运行的主线来分析它的源程序。下面先...
  • public class min { public static void main(String[] args) { int year, month, day, sum = 0; Scanner scanner = new Scanner(System.in); System.out.println("输入年:"); year = scanner.nextInt...System.
  • 程序静态分析

    万次阅读 2014-03-03 23:19:53
    静态程序分析: 程序静态分析(Program Static Analysis)是指在不运行代码的方式下,通过词法分析、语法分析、控制流分析等技术对程序代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一...
  • 腾讯移动分析(MTA)助力微信小程序数据分析

    千次阅读 热门讨论 2016-12-29 16:03:33
    微信小程序预计于1月9日正式上线,腾讯移动分析MTA已上线微信小程序分析服务,欢迎访问MTA官网体验试用。
  • 词法分析程序

    千次下载 2006-05-19 11:22:18
    编译原理的源代码,涉及了编译原理的各个过程:词法分析,LL1语法分析,语义分析,中?,C-C++,编辑器/阅读器/Editor
  • 编译原理词法分析程序

    千次阅读 2013-12-12 22:25:06
    编译原理词法分析程序
  • zynq 程序跑飞原因分析

    千次阅读 2017-02-19 13:42:35
    zynq 程序跑飞原因分析

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,285,068
精华内容 914,027
关键字:

程序分析