Sun Studio 12:Fortran 编程指南

5.1 全局程序检查 (-Xlist)

-Xlist 选项为分析源程序中的不一致及可能存在的运行时问题提供了一条颇有价值的途径。编译器执行的分析是全局性的,跨各个子程序。

–Xlist 报告子程序参数、公共块、参数在对齐、数值与类型一致性方面的错误,以及其他各种错误。

–Xlist 还可用来生成详细的源代码列表和交叉引用表。

-Xlist 选项编译的程序会自动将其分析数据内置于二进制文件中。这样便能对库中的程序执行全局程序检查。

5.1.1 GPC 概述

全局程序检查 (global program checking, GPC)(由 -Xlistx 选项调用)执行下列任务:

特别地,全局检查会报告如下问题:

5.1.2 如何调用全局程序检查

命令行中的 -Xlist 选项用于调用编译器的全局程序分析器。该选项有许多子选项,分别在以下各部分进行说明。

示例:为基本全局程序检查编译以下三个文件:


demo% f95 -Xlist  any1.f  any2.f  any3.f

在上述示例中,编译器:

5.1.2.1 屏幕输出

通常会将 -Xlistx 生成的输出列表写到文件中。要直接显示到屏幕上,请使用 -Xlisto输出文件写到 /dev/tty

示例:显示到终端:


demo% f95 -Xlisto /dev/tty  any1.f

5.1.2.2 缺省输出功能

–Xlist 选项提供了可用于输出的功能组合。不使用其他 -Xlist 选项,缺省情况下会获得以下结果:

5.1.2.3 文件类型

检查进程可识别编译器命令行中以 .f.f90.f95.for.F.F95.o 结尾的所有文件。.o 文件仅向进程提供与全局名称(如子例程和函数名)有关的信息。

5.1.3 -Xlist 和全局程序检查的一些示例

此处列出了下列示例中使用的 Repeat.f 源代码:


demo% cat Repeat.f
       PROGRAM repeat
         pn1 = 27.005
         CALL subr1 ( pn1 )
         CALL newf ( pn1 )
         PRINT *, pn1
       END

       SUBROUTINE subr1 ( x )
         IF ( x .GT. 1.0 ) THEN
          CALL subr2 ( x * 0.5 )
         END IF
       END

       SUBROUTINE newf( ix )
         INTEGER PRNOK
         IF (ix .eq. 0) THEN
                ix = -1
         ENDIF
         PRINT *, prnok ( ix )
       END

       INTEGER FUNCTION prnok ( x )
         prnok = INT ( x ) + .05
       END

       SUBROUTINE unreach_sub()
         CALL sleep(1)
       END

       SUBROUTINE subr2 (x)
         CALL subr1(x+x)
       END

示例:使用 -XlistX 显示错误、警告和交叉引用


demo% f95 -XlistX Repeat.f
demo% cat Repeat.lst
Repeat.f                    Mon Mar 18 18:08:27 2002    page 1

FILE  "Repeat.f"
program  repeat
     4           CALL newf ( pn1 )
                             ^
**** ERR  #418:  argument "pn1" is real, but dummy argument is integer
                 See: "Repeat.f" line #14
     5           PRINT *, pn1
                          ^
**** ERR  #570:  variable "pn1" referenced as real but set as integer in
                 line #4
subroutine  newf
    19           PRINT *, prnok  ( ix )
                                   ^
**** ERR  #418:  argument "ix" is integer, but dummy argument is real
                 See: "Repeat.f" line #22
function  prnok
    23           prnok = INT ( x ) + .05
                 ^
**** WAR  #1024:  suspicious assignment a value of type "real*4" to a
                 variable of type "integer*4"
subroutine  unreach_sub
    26         SUBROUTINE unreach_sub()
                          ^
**** WAR  #338:  subroutine "unreach_sub" never called from program
subroutine  subr2
    31           CALL subr1(x+x)
                 ^
**** WAR  #348:  recursive call for "subr1". See dynamic calls:
                 "Repeat.f" line #10
                 "Repeat.f" line #3

Cross Reference                 Mon Mar 18 18:08:27 2002    page 2

         C R O S S   R E F E R E N C E   T A B L E

  Source file:   Repeat.f


Legend:
D        Definition/Declaration
U        Simple use
M        Modified occurrence
A        Actual argument
C        Subroutine/Function call
I        Initialization: DATA or extended declaration
E        Occurrence in EQUIVALENCE
N        Occurrence in NAMELIST
L        Use Module



Cross Reference                 Mon Mar 18 15:40:57 2002     page 3

P R O G R A M   F O R M

 Program
 -------

repeat          <repeat>        D      1:D

Cross Reference                 Mon Mar 18 15:40:57 2002    page 4


 Functions and Subroutines
 -------------------------

INT      intrinsic
                <prnok>         C     23:C

newf            <repeat>        C      4:C
                <newf>          D     14:D

prnok    int*4  <newf>         DC     15:D     19:C
                <prnok>        DM     22:D     23:M

sleep           <unreach_sub>            C     27:C

subr1           <repeat>        C      3:C
                <subr1>         D      8:D
                <subr2>         C     31:C

subr2           <subr1>         C     10:C
                <subr2>         D     30:D

unreach_sub     <unreach_sub>            D     26:D

Cross Reference                 Mon Mar 18 15:40:57 2002    page 5


 Variables and Arrays
 --------------------

ix      int*4  dummy
                <newf>       DUMA     14:D     16:U     17:M     19:A

pn1      real*4 <repeat>      UMA      2:M      3:A      4:A      5:U

x       real*4 dummy
                <subr1>        DU      8:D      9:U     10:U
                <subr2>        DU     30:D     31:U     31:U
                <prnok>        DA     22:D     23:A

------------------------------------------------------------------
STATISTIC                    Mon Mar 18 15:40:57 2002    page 6


Date:     Mon Mar 18 15:40:57 2002
Options:  -XlistX
Files:         2 (Sources: 1; libraries: 1)
Lines:        33 (Sources: 33; Library subprograms:1)
Routines:      6 (MAIN: 1; Subroutines: 4; Functions: 1)
Messages:      6 (Errors: 3; Warnings: 3)

5.1.4 跨例程全局检查的子选项

基本的全局交叉检查选项是不带子选项的 -Xlist。它是子选项的组合,其中的每一项都可以单独指定。

以下部分介绍用于生成列表、错误或交叉引用表的选项。命令行中可以出现多个子选项。

5.1.4.1 子选项语法

按下列规则添加子选项:

5.1.4.2 -Xlist 及其子选项

按下列规则合并子选项:

示例:以下两个命令行中的每一个执行相同的任务:


demo% f95  -Xlistc  -Xlist  any.f

demo% f95 - Xlistc  any.f

下表展示单独由这些基本的 -Xlist 子选项生成的报告:

表 5–1 基本的 Basic Xlist 子选项

生成的报告 

选项 

错误、列表、交叉引用 

–Xlist

仅错误 

–XlistE

仅错误以及源码列表 

–XlistL

仅错误以及交叉引用表

–XlistX

仅错误以及调用图

–Xlistc

下表展示所有 -Xlist 子选项。

表 5–2 -Xlist 子选项的完整列表

选项 

操作 

–Xlist无子选项

显示错误、列表和交叉引用表 

–Xlistc

显示调用图和错误

单独使用时,-Xlistc 不显示列表或交叉引用。它使用可打印字符以树的形式产生调用图。如果某些子例程未自 MAIN 中调用,会显示一个以上的图。单独打印每一个 BLOCKDATA,不连接到 MAIN

缺省时显示调用图。

–XlistE

显示错误

单独使用时,-XlistE 只显示跨例程错误而不显示列表或交叉引用。

–Xlisterr[nnn]

在检验报告中禁止错误 nnn

可使用 -Xlisterr 禁止来自列表或交叉引用的编号错误信息。

例如:-Xlisterr338 禁止错误消息 338。要禁止其他特定的错误,可重复使用该选项。如果未指定 nnn,会禁止所有错误消息。

–Xlistf

更快地产生输出 

可使用 -Xlistf 产生源文件列表和交叉检查报告,并在未完全编译的情况下检查源代码。

–Xlisth

显示来自交叉检查停止编译的错误 

使用 -Xlisth,如果在交叉检查程序时检测到错误,编译将会停止。此时,会将报告重定向到 stdout 而非 *.lst 文件。

–XlistI

列表和交叉检查 include 文件

如果 -XlistI 是唯一使用的子选项,会随 -Xlist 标准输出(行编号列表、错误消息和交叉引用表)一同显示或扫描 include 文件。

列表-如果未禁止列表,则会在适当位置列出 include 文件。文件会按其被包含的次数列出。这些文件是:源文件、#include 文件、INCLUDE 文件

交叉引用表-如果未禁止交叉引用表,会在生成交叉引用表时扫描下列所有文件:源文件、#include 文件、INCLUDE 文件

缺省时不显示 include 文件。

–XlistL

显示列表和错误

使用 -XlistL 仅产生列表和跨例程错误列表。该子选项本身并不显示交叉引用表。缺省时显示列表和交叉引用表

–Xlistln

设置分页符 

可使用 -Xlistl 将页长度设置为缺省页面大小以外的值。例如,-Xlistl45 将页长度设置为 45 行。缺省值为 66。

如果使 n=0 (-Xlistl0 ),该选项将显示不带分页符的列表和交叉引用,以便于屏幕查看。

-XlistMP

(SPARC) 检查 OpenMP 指令的一致性

可使用 -XlistMP 报告源代码文件中指定的 OpenMP 指令的不一致性。有关详细信息,另请参见《OpenMP API 用户指南》。

–Xlisto name

指定 -Xlist 输出报告文件

可使用 -Xlisto 指定生成的报告输出文件。(在 oname 之间必须有一个空格。)使用 -Xlisto name,将会输出到 name 而不是 file.lst

要直接显示到屏幕上,请使用以下选项: -Xlisto /dev/tty

–Xlists

禁止交叉引用中未引用的符号 

可使用 -Xlists 在交叉引用表中禁止 include 文件中已定义但源文件中未引用的任何标识符。

如果使用了子选项 -XlistI,该子选项将不起作用。

缺省情况下,显示 #includeINCLUDE 文件中出现的标识符。

–Xlistvn

设置检查“严格”程度 

n 可以是 1、234。缺省值为 2 (–Xlistv2):

  • –Xlistv1

    仅以摘要形式显示所有名称的交叉检查信息,不带行号。这是检查严格性的最低级别-仅检查语法错误。

  • –Xlistv2

    以摘要和行号显示交叉检查信息。这是检查严格性的缺省级别,包括参数不一致性错误和变量使用错误。

  • –Xlistv3

    以摘要、行号和公共块映射显示交叉检查。这是检查严格性的较高级别,包括由不同子程序公共块中数据类型的错误使用所造成的错误。

  • –Xlistv4

    以摘要、行号、公共块映射和等价块映射显示交叉检查。这是最为严格的检查级别,可以检测出最多的错误。

–Xlistw[nnn]

设置输出行的宽度 

可使用 -Xlistw 设置输出行的宽度。例如,-Xlistw132 将页宽度设置为 132 列。缺省值为 79。

–Xlistwar[nnn]

在报告中禁止警告 nnn

可使用 -Xlistwar 禁止输出报告中的特定警告消息。如果未指定 nnn,则禁止打印所有警告消息。例如,-Xlistwar338 禁止警告消息号 338。要禁止一条以上的警告但并非所有警告,可重复使用该选项。

–XlistX

只显示交叉引用表和错误 

-XlistX 产生交叉引用表和跨例程错误列表,但不产生任何源代码列表。