USER'S MANUAL FORTRAN-lint SOURCE CODE ANALYZER Version 3.00 IPT Since 1974 1096 East Meadow Circle, Palo Alto, CA 94303 Tel: (415) 494-7500 Fax: (415) 494-2758 E-mail: lint@iptcorp.com FORTRAN-lint USER'S MANUAL A SOURCE LEVEL CODE ANALYZER For FORTRAN PROGRAMMING On UNIX and VMS BASED SYSTEMS March 1994 Version 3.00 Note: Licensed Users may photocopy for distribution. Direct comments concerning this manual to: IPT 1096 East Meadow Circle, Palo Alto, California 94303 Tel: (415) 494-7500 Fax: (415) 494-2758 E-mail: lint@iptcorp.com Copyright 1987-1994 IPT NOTICE OF COPYRIGHTS Copyrighted by IPT as an unpublished work. All rights reserved. In claiming any copyright protection which may be applicable, IPT reserves and does not waive any other rights that it may have (by agreement, statutory or common law, or otherwise) with respect to this material. See Notice of Proprietary Rights. NOTICE OF PROPRIETARY RIGHTS This manual and the material on which it is recorded are the property of IPT. Its use, reproduction, transfer and/or disclosure to others, in this or any other form, is prohibited except as permitted by a written License Agreement with IPT. This manual is intended as a thorough product description. It is, to the best of our knowledge, complete and accurate. IPT reserves the right to update this document without prior notification. IPT warrants that this product works essentially as described in this manual. IPT reserves the right to update this documentation without prior notification. FORTRAN-lint is a registered trademark of IPT. Xlint is a trademark of IPT. SunOS is a registered trademark of Sun Microsystems, Incorporated. UNIX is a registered trademark of AT&T Bell Laboratories. DEC, ULTRIX, VAX, and VMS are registered trademarks of Digital Equipment Teamwork and Teamwork/SD are registered trademarks of CADRE Technologies. Table of Contents 1. Introduction 1.1 Overview 2. Getting Started 2.1 Analyzing Programs 2.2 Managing the Output 2.2.1 Redirection 2.2.2 Summary Mode 2.2.3 Statistics Output 2.3 Call Trees and Cross Reference Tables 3. Command Reference 3.1 Command Format 3.1.1 Command Line Switches 3.1.2 Using UNIX Style Options Under VMS 3.2 Summary Of Options 3.2.1 Option Summary Under UNIX 3.1.2 Option Summary Under VMS 3.3 Configuration Files 3.4 Environment Variables / Logicals 4. FORTRAN-lint Source Conventions 4.1 Source Format 4.2 Include Files 4.3 C Preprocessor (CPP) (UNIX Only) 4.4 CDD and DBMS Processing (VMS Only) 4.4.1 CDD (Common Data Dictionary) Declarations 4.4.2 DBMS Support (FDML statements) 4.4.3 CDD/DBMS Requirements 4.5 FORTRAN-77 Extensions 4.6 Changing the FORTRAN Dialect 4.7 Default Sizes 5. Controlling Analysis 5.1 Setting the Scope 5.2 Message Classification 5.3 Selecting Analysis Level 5.4 Supressing Individual Messages 5.5 Portability Checking 6. Analysis Output 6.1 Overview 6.2 Splitting the Output 6.3 Summary Mode 6.4 Analysis Output 6.4.1 Switches and Filenames 6.4.2 Source Listing 6.4.3 Diagnostic Messages 6.5 Statistics Output 7. Call Trees 7.1 Overview 7.2 Tree Options 7.2.1 Arguments 7.3 Call Tree Format 7.3.1 Trimmed Trees 7.3.2 Condensing Multiple Calls 7.3.3 Sorting Alphabetically 7.3.4 Squished Trees 7.3.5 Graphic Character Set 7.4 Call Tree Content 7.4.1 Top Node 7.4.2 Undefined Routines 7.4.3 Library Routines 7.5 Recursion 7.6 Dummy Routines 7.7 Entry Point 8. Cross Reference 8.1 Overview 8.2 Layout 8.2.1 Program Routines 8.2.2 Block Data Routines 8.2.3 Subroutines and Functions 8.2.4 Common Blocks 8.2.5 Structures 8.2.6 Variables, Arrays, and Records 8.2.7 Parameters 8.3 Format Selection 8.4 Content Selection 9. Library Support 9.1 Using Library Files 9.2 Creating Library Files 9.3 Miscellaneous Library Issues 9.3.1 Interaction with Cross Reference and Call Trees 9.3.2 Library File Format 9.4 Creation of Library Routine Shells 10. Database and ".fdb" Files 10.1 What Are ".fdb" Files 10.2 How to Create ".fdb" Files 10.3 ".fdb" and Xlint 10.3.1 What Is Xlint 10.3.2 Creating ".fdb" Files for Xlint 11. CADRE Teamwork Support 11.1 Overview 11.2 Configuration Appendix D. Output Samples D.1 Sample FORTRAN Program D.2 Analysis Output D.3 Statistics Output D.4 Call Tree D.5 Freeform Cross Reference D.6 Tabular Cross Reference Appendix E. Diagnostic Messages E.1 Format E.2 Diagnostic message list syntactical errors data and symbol classification errors variable usage checking miscellaneous errors control structures local data type checking interface checking (argument passing) preprocessor constants data type conversions statements miscellaneous Appendix F. Performance F.1 Disk Space F.1.1 Program Size F.1.2 Temporary Files Chapter 1 Introduction 1.1 Overview FORTRAN-lint is a programming tool that simplifies the debugging and maintenance of both large and small FORTRAN programs. FORTRAN-lint includes a source code analyzer which can detect a wide range of potential problems, including: - inappropriate arguments passed to functions - inappropriate library calls - inconsistencies in common-block declarations - non-portable code - type usage conflicts across different modules - unused functions, subroutines, and variables - variables which are referenced but not set The FORTRAN-lint source code analyzer is more comprehensive than a standard FORTRAN compiler, in many aspects. FORTRAN-lint analyzes source files both individually and as a group, and can identify problems which are beyond the scope of a compiler. For the same reason, FORTRAN-lint can perform some of the checking that might be done by an advanced program linker, and can carry the analysis out to a greater extent. The FORTRAN-lint source code analyzer can be used to: - examine source files extensively before they are compiled - map out the structure of unfamiliar programs - point out undetected problems in a production program - enforce programming standards - improve portability The diagnostic messages produced by the FORTRAN-lint source code analyzer are more detailed than those produced by standard compilers and cover a wider range of problems. In addition, FORTRAN-lint can produce a detailed call tree and a symbol table cross reference. The manager of a programming group may not have the time to study all of the code written by the group in detail. FORTRAN-lint allows the manager to spot deviations from good programming practice quickly and efficiently. FORTRAN-lint can be used to spot potential portability problems in a body of code. This feature can reduce the amount of work to be done when a program must be moved to a new machine or a new operating system. Chapter 2 Getting Started 2.1 Analyzing Programs To run FORTRAN-lint, use a command of the form under UNIX: flint -switches file1.f file2.f file3.f or under VMS: flint /switches file1.for file2.for file3.for where "switches" can be one or more of the FORTRAN-lint letter switches, and each of the specified files is a FORTRAN source file containing any number of FORTRAN 77 subprograms. Switches may be intermixed with or appear after file names. If FORTRAN-lint is invoked without any switches or parameters, i.e., flint a help screen will be output. If source files are specified, but no switches are given, FORTRAN-lint will perform a basic analysis of the source files and output the results to the console. The following command will analyze the FORTRAN source file demo.f: flint demo.f under UNIX or flint demo.for under VMS The following command will perform a more detailed analysis, including statistics: flint -fgs demo.f under UNIX or flint /FYI/GLOBAL/STATISTICS demo.for under VMS 2.2 Managing the Output When running FORTRAN-lint on a large program for the first time, it usually picks up hundreds or thousands of inconsistencies. FORTRAN-lint has several features to allow for managing this output in an orderly manner. 2.2.1 Redirection The command-line switch "-Sname" under UNIX, or "/SPLIT=name" under VMS will cause FORTRAN-lint to redirect output from the console to the following files: Under UNIX: Analysis output --> name.lnt Xref table (-x) --> name.xrf Call tree (-t) --> name.tre Statistics (-s) --> name.stt Under VMS: Analysis output --> name.lnt Xref table (/XREFERENCE) --> name.xrf Call tree (/TREE) --> name.tre Statistics (/STATISTICS) --> name.stt For example, the following command under UNIX: flint -fgs demo.f -Sdemo Or under VMS: flint /FYI/GLOBAL/STATISTICS demo.for /SPLIT=demo will analyze the FORTRAN file "demo.f" and send the analysis output to the file "demo.lnt". The statistics output will be sent to the file "demo.stt". 2.2.2 Summary Mode Useful for large programs, the summary mode (the "-+" switch under UNIX, or "/SUMMARY" under VMS) provides a meter to gauge progress as the sources are analyzed. Upon completion, a one-page summary of the most frequent messages encountered is output to the console. This mode forces redirection of all other output if redirection has not already been selected with the "-S" or "/SPLIT" switch. The following command will perform a detailed analysis of the source file "demo.f", output a one-page summary to the console, send analysis output to the file "flint.lnt", and send statistics output to the file "flint.stt": flint -fgs+ demo.f or flint /FYI/GLOBAL/STATISTICS/SUMMARY demo.for The following command will do the same, but will send output to "demo.lnt" and "demo.stt": flint -fgs+ demo.f -Sdemo or flint /FYI/GLOBAL/STATISTICS/SUMMARY demo.for /SPLIT=demo 2.2.3 Statistics Output When the "-s" or "/STATISTICS" switch is used, a list of program statistics and an error message summary is output after the analysis is complete. When there is a large amount of analysis output, the error message summary is useful for a quick determination of the types of problems found in the FORTRAN sources. In summary mode ( "-+" or "/SUMMARY" switch ), the first screenful of the error message summary is also output to the console. 2.3 Call Trees and Cross Reference Tables In addition to reporting inconsistencies in the source code, FORTRAN-lint can generate diagrams of program structure and cross referenced tables of symbols. The following command will analyze the FORTRAN file "demo.f", output a call tree to the file "demo.tre", and output a cross reference table to the file "demo.xrf": flint -tx demo.f -Sdemo or flint /TREE/XREFERENCE demo.for /SPLIT=demo See Section 3.2.1, and Chapters 7 and 8, for more information about the call tree and cross reference features. Chapter 3 Command Reference 3.1 Command Format FORTRAN-lint is invoked by the "flint" command, followed by switches and file names. A complete format may look like this: flint [switches] [file1 [file2 ...]] [file.lbt] [file.fdb] where "switches" can be one or more of the FORTRAN-lint letter switches, "file1" and "file2" are FORTRAN source files, "file.lbt" is a call interface library file, and "file.fdb" is a database file. If there are no switches or file names present on the command line, a help screen will be output to the console. File names on the command line which are not part of a switch and do not have the special extensions, ".lbt" (library files) or ".fdb" (database files), are taken as FORTRAN source files to be analyzed. On the UNIX based systems, if the source file has an ".F" (capital F) extension, the C preprocessor will first be run on the file. 3.1.1 Command Line Switches Switches may be given in any order, and may be intermixed freely with the source file names. Some switches are simple toggles, while others require one or more arguments. On the UNIX based systems, the lowercase switches indicate that they are simple toggles, and may be combined; e.g., "-s -x -t" may be written as "-sxt". The uppercase switches require one or more arguments, which may be separated from the switch with a space; e.g., "-S result" and "-P SGI SUN". On the VMS based systems, all word switches may be abbreviated to the point of uniqueness, which usually takes 3 or 4 characters. For switches that accept arguments, the arguments may be separated from the switch with an equal ("=") sign or nothing; a space should not be used. If a switch accepts multiple arguments, they should either be separated by commas, or used in multiple instances of the switch. If separated by commas, there should be no spaces before or after the comma. Note that if multiple arguments are used for a switch under VMS, parentheses ("()") are required before the first and the last arguments for FORTRAN-lint to take all of them. For instance, the "-O" and "/SUPPRESS=" options are used to suppress messages under UNIX and VMS, respectively. Using "-O 123 -O 200,201,202" under UNIX, or "/SUPPRESS=123 /SUPPRESS=(200,201,202)" under VMS, will suppress messages 123, 200, 201, and 202. Switches may be disabled by preceding the switch with an additional dash ("--") under UNIX or with the word "NO" under VMS. When a multiple argument switch is cleared, all the arguments applied to that switch up to that point are cleared. Example: flint --w --x file.f or flint /NOWARNING/NOXREFERENCE file.for The above will suppress all warning messages and the cross-reference on the FORTRAN-lint diagnostic output. Switches are processed from left to right; therefore, the rightmost appearance of a toggle switch determines its final state. Switches that take multiple arguments have their argument lists built up from left to right. Switches which take only one argument use the argument from the rightmost appearance of the switch. Default values for switches are set with configuration files, one of which is supplied with the package. See Section 3.3 (Configuration Files) for more information. A complete list of the FORTRAN-lint switches is as follows: -a, /ANSI Description: Report non-ANSI constructs. Same effect as "-P ansi" ("/PORTABILITY=ansi"). UNIX syntax: -a VMS syntax: /ANSI -B, /DATABASE= Description: Create a database file (".fdb") that contains all the information FORTRAN-lint and Xlint need to regenerate call trees, symbol table cross reference information, and source analysis messages, at a later time without having to reprocess the sources. The ".fdb" extension is automatically attached to the file name when a database is created. UNIX syntax: -B file VMS syntax: /DATABASE=file -C, /CADRE= Description: Generate CADRE data files. UNIX syntax: -C option,... VMS syntax: /CADRE=(option,...) Examples: -Cteamwork=treefile /CADRE=teamwork:treefile The above command will create a file called "treefile" that can be used as the input for building a Teamwork/SD model. -d, /DLINES Description: Include debug lines (i.e. source lines with a "D" in their first columns) in the source analysis. If this option is not selected, they are treated as comment lines. UNIX syntax: -d VMS syntax: /DLINES -D Description: Define symbols for the C preprocessor. Applies only if source files are preprocessed (".F" file extension or "-p" switch). Available only on UNIX based systems. UNIX syntax: -D symbol[=value],... -e, /EXTEND Description: Extend width of source file lines from 72 to 132 columns. If this option is not selected, all characters past column 72 are ignored. UNIX syntax: -e VMS syntax: /EXTEND -E, /FILES= Description: Expand a specification file, which may contain names of the source files to be processed and/or the FORTRAN-lint options, onto the command line. Source file names and FORTRAN-lint options may be intermixed together in a specification file. They can be separated by commas, newlines, or spaces, and are treated as if they appeared on the command line in place of the "-E" or "/FILE=S" switch. Nested expansions are allowed ( i.e. the file may contain the "-E" or "/FILES=" switches ). This switch can not be suppressed by using "--E" or "/NOFILES". UNIX syntax: -E file,... VMS syntax: /FILES=(file,...) -f, /FYI Description: FYI (for your information) diagnostics. Print hints which may be cause for concern, reporting anything that looks useless, wasteful or redundant. UNIX syntax: -f VMS syntax: /FYI -g, /GLOBAL Description: Global analysis. If this switch is not specified, subprograms are processed on an individual basis and call interface checking is not performed. This switch enables checking for consistencies between subprograms, such as argument lists and common blocks. Also improves usage checking and cross referencing of variables passed as actual arguments in function or subroutine calls. Highly recommended. This switch must be turned on if a database is to be generated for Xlint to use. UNIX syntax: -g VMS syntax: /GLOBAL -i, /INCLUDE Description: Expand include files in source listing. Applies only when the option for source listing is selected ( "-l" or "/LISTING" ). UNIX syntax: -i VMS syntax: /INCLUDE -I, /PATH= Description: Set the search path for the files in the INCLUDE statements. UNIX syntax: -I path,... VMS syntax: /PATH=([path],...) Example: -I ../myftn,/usr/sam/headers under UNIX /PATH=([FTNCODE],[USR.SAM.HEADERS]) under VMS /IMPLICIT See option "-m" below. -l, /LISTING Description: Output a source listing with line numbers. UNIX syntax: -l VMS syntax: /LISTING -L, /LIBRARY= Description: Create or update a call interface library file ( ".lbt" ). Interface information from subprograms can be stored in call interface libraries to be used in analysis at a later date. Libraries can be used on subsequent runs during global analysis to check for subroutine or function argument list consistency without having to reparse the source file they were generated from. This option causes FORTRAN-lint to run in a special mode, bypassing normal analysis, so it should only be used to create libraries. Because no diagnostic output is given when creating or updating libraries, files should be clean before this switch is used. UNIX syntax: -L file VMS syntax: /LIBRARY=file Example: flint -L vmslib.lbt vmslib.lsh flint /LIBRARY=mylib.lbt mylib.for /LPP= See option "-Y" below. -m, /IMPLICIT Description: Report the use of implicit data typing. UNIX syntax: -m VMS syntax: /IMPLICIT -O, /SUPPRESS= Description: Suppress individual error messages by their numbers. UNIX syntax: -O #,... VMS syntax: /SUPPRESS=(#,...) Example: flint -O 123 -O 200,201 myftn.f flint /SUPPRESS=123 /SUPPRESS=(200,201) myftn.for /OUTPUT= Description: Redirect output to a file. Available only on VMS based systems. VMS syntax: /OUTPUT=file See also "-S" or "/SPLIT=" option. -p Description: Send all source files through the C preprocessor. If this option is not selected, only, source files with the ".F" extension will be preproccessed. Available only on UNIX based systems. UNIX syntax: -p -P, /PORTABILITY= Description: Check portability to target system. One or more systems can be checked at once. Systems currently supported by FORTRAN-lint include: ANSI (Fortran-77) SGI CRAY SUN HPUX ULTRIX NCUBE VAX or VAXVMS OS32(Concurrent OS/32) UNIX syntax: -P system,... VMS syntax: /PORTABILITY=(system,...) -q, /QUIT Description: Do not queue the job if there are no licenses currently available. By default, the FORTRAN-lint license manager will queue jobs if all licenses are in use. UNIX syntax: -q VMS syntax: /QUIT -s, /STATISTICS Description: Print statistics related to the source code being analyzed, including a summary of the messages output during analysis. UNIX syntax: -s VMS syntax: /STATISTICS -S, /SPLIT= Description: Redirect and split output to a group of files. This sends the analysis, statistics, call tree, and cross reference to separate files ( file.lnt, file.stt, file.tre, file.xrf ). UNIX syntax: -S file VMS syntax: /SPLIT=file /SUMMARY See option "-+" below. /SYSTEM= See option "-V" below. -t, /TREE Description: Generate a call tree. This shows the calling structure of the analyzed program in a graphical diagram. See "-T" or "/TREE=" for options. UNIX syntax: -t VMS syntax: /TREE -T, /TREE= Description: Tree formatting and content options. Implies "-t" or "/TREE". One or more options can be specified, including: help Outputs a help screen describing tree commands. head:symbol Show tree headed by given symbol. trim Trims the tree by suppressing repeated subtrees. squish Shrinks the tree vertically by single spacing. graphics=xxx Changes the tree graphics characters. condensed Condenses multiple calls to the same routine. alphabetical Sorts call tree alphabetically. nolibrary Suppress calls to libraries ( ".lbt" files ). noundefined Suppress calls to undefined routines. See Chapter 7 (Call Trees) for further details on this option. UNIX syntax: -T option,... VMS syntax: /TREE=(option,...) -u, /USAGE Description: Perform variable usage checking. This option flags bad usage such as variables referenced (used) but never set. Usually on by default, but can be disabled ("--u" or "/NOUSAGE") for call tree or cross reference generation without excess checking. UNIX syntax: -u VMS syntax: /USAGE /UNIXHELP See option "-?" below. -V, /SYSTEM= Description: Specify the target compiler/FORTRAN dialect by system name. This helps the parser resolve ambiguous extensions (constructs which look similar, but are handled differently on different systems). This switch is only necessary when the source code is not expected to compile properly on the host machine. The following systems are supported: ANSI (Fortran-77) SGI CRAY SUN HPUX ULTRIX NCUBE VAX or VAXVMS OS32(Concurrent OS/32) UNIX syntax: -V system VMS syntax: /SYSTEM=system -w, /WARNINGS Description: Report warnings. Usually on by default. May be disabled by using "--w" or "/NOWARNINGS". UNIX syntax: -w VMS syntax: /WARNINGS -W, /WIDTH= Description: Set output width in columns. Affects all output, including analysis and cross reference table. Any value between 40 and 500 is allowed. Under VMS, if output is being directed to SYS$OUTPUT, the default width is 80 columns; otherwise, it is 132 columns. Under UNIX, the default width is 80 columns. UNIX syntax: -W number VMS syntax: /WIDTH=number -x, /XREFERENCE Description: Generate a cross reference listing. Shows information on all symbols, including where they appear, and how they are used. See "-X" or "/XREFERENCE=" for options. UNIX syntax: -x VMS syntax: /XREFERENCE -X, /XREFERENCE= Description: Cross reference formatting and content. Implies "-x" or "/XREFERENCE". Options include: freeform A compact format with variable width (default). tabular A table format, needs 132 columns. linenumbers Locations by line numbers rather than subprogram. This option must be selected if a database file ( ".fdb") is to be generated for Xlint to use. nolegend Suppress legend describing line number usage codes. For specific queries. See Sections 8.3 and 8.4. See Chapter 8 (Cross Reference) for further details on this option. UNIX syntax: -X option,... VMS syntax: /XREFERENCE=(option,...) -Y, /LPP= Description: Set lines per page. Use 0 to turn off pagination. Default is 0 for screen output, and 60 lines per page if output is redirected with "-S" or "/SPLIT=". UNIX syntax: -Y number VMS syntax: /LPP=number -2, /NOI4 Description: Assume two-byte integers and two-byte logical variables. By default, INTEGER and LOGICAL declarations are interpreted as INTEGER*4 and LOGICAL*4. If this option is used, INTEGER and LOGICAL declarations are interpreted as INTEGER*2 and LOGICAL*2. UNIX syntax: -2 VMS syntax: /NOI4 -+, /SUMMARY Description: Show animated progress meter during parsing, and output the FORTRAN-lint analysis summary upon completion. If the "-S" or "/SPLIT=" switch was not specified, it will be implied, sending analysis output to "flint.lnt", "flint.stt", etc. UNIX syntax: -+ VMS syntax: /SUMMARY -?, /UNIXHELP Description: Display UNIX style command options ("-option"). Besides the VMS style options ("/option"), FORTRAN-lint also accepts the UNIX style options under VMS. See Section 3.1.2. Available only on VMS based systems. VMS syntax: -? or /UNIXHELP 3.1.2 Using UNIX Style Options Under VMS The UNIX style FORTRAN-lint options ("-options") can be also used under VMS. Unlike the options used under UNIX, FORTRAN-lint does not allow any space between the "-" sign and the options under VMS. Lowercase switches indicates that they are simple toggles, and may be combined. For example, "-g -w -t" may be written as "-gwt". The toggle switches are not case sensitive under VMS. Therefore, when users enter "-GWT", FORTRAN-lint regards it as "-gwt", and translates it into "/GLOBAL /WARNINGS/TREE". Double quotes (" ") are not necessary here. Uppercase is required for switches that require arguments. Users must use double quotes (" ") before the uppercase switch and after its argument for FORTRAN-lint to take both as a whole; e.g., "-Psgi" is the same as /PORTABILITY=sgi. FORTRAN-lint takes only one argument for each uppercase switch. If users want to assign multiple arguments to a switch, they should separate the arguments, and treat them as the single arguments of multiple switches. For example, "/TREE=condensed,nolibrary" may be also written as "-Tcondensed" "-Tnolibrary" under VMS. The following examples show users how to use the UNIX style options under VMS to achieve what their equivalent VMS style options do: 1) flint /IMPLICIT myfile.for flint -m myfile.for or flint -M myfile.for 2) flint /IMPLICIT /XREF /NOI4 myfile.for flint -mx2 myfile.for 3) flint /SPLIT=result /WARNINGS /WIDTH=50 myfile.for flint "-Sresult" -W "-W50" myfile.for 4) flint /PORTABILITY=(SUN,SGI,VAX) myfile.for flint "-Psun" "-Psgi" "-PVAX" myfile.for 5) flint /ANSI /FYI /GLOBAL/SUPPRESS=(123,201,202) myfile.for flint -afG "-O200" "-O201" "-O202" myfile.for 3.2 Summary of Options 3.2.1 Option Summary Under UNIX Source configuration options: -d include debug lines -e extend source width to 132 columns -I path,... set search path for include files -p send all source files through preprocessor (CPP) -V system specify FORTRAN dialect -2 two byte integers and logicals Diagnostic options: -a report non-ANSI constructs -f report FYI messages -g global processing -m report implicit variables -O number,... suppress individual error messages -P system,... portability checking -u data usage checking -w report warnings Cross reference options: -x generate cross reference -X option,... cross reference content and formatting ( -Xhelp for more information ) Call tree options: -t generate call trees -T option,... call tree content and formatting ( -Thelp for more information ) Output format options: -i expand include files in listing -l source listing -W number set output width -Y number set output page length Other output control options: -+ progress/summary mode ( implies -S ) -B file create database ( ".fdb" ) -L file call interface library generation mode ( ".lbt") -s statistics -S file split and redirect output to files Miscellaneous options: -C option,... generate Cadre data files -D definition,... define symbols for preprocessor (CPP) -E file expand configuration file onto command line -q do not queue jobs if no licenses are available 3.2.2 Option Summary Under VMS Source configuration options: /DLINES include debug lines /EXTEND extend source width to 132 columns /NOI4 two byte integers and logicals /SYSTEM=system specify version of extended FORTRAN 77 /PATH=([path],...) set search path for include files Diagnostic options: /ANSI report non-ANSI constructs /FYI report FYI messages /GLOBAL global processing /IMPLICIT report implicit variables /NOUSAGE suppress usage checking /NOWARNINGS suppress warnings /PORTABILITY=(system,...) portability checking /SUPPRESS=(number,...) suppress individual error messages /USAGE data usage checking /WARNINGS report warnings Cross reference options: /XREFERENCE generate cross reference /XREFERENCE=(option,...) format options for cross reference ( /XREF=help for more information ) Call tree options: /TREE generate call tree /TREE=(option,...) formal options for call tree ( /TREE=help for more information ) Output format options: /INCLUDE expand include files in listing /LIST source listing /LPP=number set output page length /WIDTH=number set output width Other output control options: /DATABASE=file create database ( ".fdb" ) /LIBRARY=file call interface library generation mode ( ".lbt") /OUTPUT=file redirect output to a specified file /SPLIT=file split and redirect output /STATISTICS statistics /SUMMARY progress/summary mode Miscellaneous options: /CADRE=(option,...) generate CADRE data files /FILES=file expand configuration file onto command line /LICENSE=option license manager options /QUIT do not queue jobs if no licenses are free /UNIXHELP or -? display UNIX style command options * See Appendix C for administrative commands for FORTRAN-lint license managers. 3.3 Configuration Files FORTRAN-lint can be used for many different purposes: running a quick syntax check on a recently modified file, evaluating the reliability of a large production program, or helping understand unfamiliar code, to name a few. This wide range of uses makes one set of defaults unsuitable for all situations. Several levels of configuration have been provided to allow for appropriate defaults. Configuration files contain switches and file names in much the same format as they would be used on the command line. The differences are that newlines may by used as white space, and that an exclamation point (!) designates the start of a comment, which continues to the end of the line. Under UNIX, configuration files are not parsed by the shell, so wildcard expansions, redirection, backgrounding, etc. cannot be done from within these files. Whenever FORTRAN-lint is run, it looks for the "flint.cfg" files in the following order, with the last taking the highest precedence: 1) In the directory specified by the environment variable/logical name FLINTCFG. 2) If FLINTCFG is not defined, or if there is no "flint.cfg" in that directory, then it looks into the FORTRAN-lint installation directory. 3) In the current directory. These configuration files are processed before the command line, so that switches specified on the command line override or supplement those in the configuration files. Configuration files specified by the "-E" or "/FILES=" (expand) switch are processed at the same position as the "-E" or "/FILES=" switch. File names may also appear in configuration files, but there is no provision for deselecting files. Note that wildcards in file names in configuration files are expanded under VMS while they are not under UNIX. On the UNIX base systems, using configuration files to hold source file names can get up to the 1024 command line argument limit of some shells. This is a typical default "flint.cfg" provided with FORTRAN-lint under UNIX: -w ! enable warnings -u ! enable usage checking -O207 ! hollerith constant warning -O276 ! data type conversion -O76 ! mixed mode arithmetic -O261 ! initializer data type converted -Ttrim ! make TRIM the default tree format --t ! default is to NOT output tree -Xno_unreferenced_parameters ! eliminate unreferenced parameters -Xno_unused_common_variables ! show common variables only where ! they are used --x ! default is to NOT output xref Check your "flint.cfg" file. Your default switches may vary from those shown above. Similarly, a typical default "flint.cfg" under VMS may look like the following: /WARNINGS ! enable warnings /USAGE ! enable usage checking /SUPPRESS=207 ! hollerith constant warning /SUPPRESS=276 ! data type conversion /SUPPRESS=76 ! mixed mode arithmetic /SUPPRESS=261 ! initializer data type converted /TREE=trim ! make TRIM the default tree format /NOTREE ! default is to NOT output tree /XREFERENCE=no_unreferenced_parameters ! eliminate unreferenced parameters /XREFERENCE=no_unused_common_variable ! show common variables only where ! they are used /NOXREFERENCE ! default is to NOT output xref 3.4 Environment Variables / Logicals Certain defaults can be overridden by setting environment variables. These are generally installation or system configuration options. environment variable description ----------- --------------------------------------------- FLINTHOST host name of machine running license server daemon FLINTHOME directory that contains the flint support files (flint.err, etc.) FLINTCFG directory that contains alternate support files TMPDIR directory to store temporary files under UNIX SYS$SCRATCH directory to store temporary files under VMS The environment variable (logical) "FLINTCFG" allows the user to alter FORTRAN-lint's configuration by specifying a directory that will be searched before the installation directory when looking for the support files. The files that follow this search path include "flint.err" (the error message file), "flint.cfg" (the default configuration file), "flint.hls" (the help screen file), and the library files "unixlib.lbt" and "vmslib.lbt". The environment variable "TMPDIR" under UNIX and the logical "SYS$SCRATCH" under VMS can be set to change the directory where FORTRAN-lint places its temporary files. They can be redefined at any time to point to another location with sufficient disk quota. "TMPDIR" is supported on the UNIX based systems that provide it within the "tempnam( )" system function. "FLINTHOME" and "FLINTHOST" override the values that were patched into the executable during installation. See Appendix A (Installation Under UNIX) or B (Installation Under VMS) for more information. Chapter 4 FORTRAN-lint Source Conventions 4.1 Source Format FORTRAN-lint accepts one or more FORTRAN 77 source files, each of which may contain one or more FORTRAN 77 subprograms. A subprogram may be a subroutine, a function, a block data module, or a main program. Do not place INCLUDE file names on the command line or in configuration files. FORTRAN-lint understands several different source formats. The default format is the ANSI standard fixed format, with a continuation indicator at column 6, and a comment field starting at column 73. If the source file contains code beyond column 72, the "-e" switch under UNIX or "/EXTEND" under VMS can be used to tell FORTRAN-lint to accept input lines of up to 132 columns, with no fixed position comment field. TAB formatting is supported for those systems that allow it, where a TAB character in the label field skips to an optional non-zero single digit continuation indicator. There is no fixed position comment field in TAB formatted lines. TAB formatting can coexist with fixed format lines in the same file, subprogram, or even in a continued statement. Spaces are significant only in character strings or Hollerith constants. There is optional checking to detect spaces embedded in symbol names, however. The maximum number of continuation lines supported is 1000 lines per statement, and there is a maximum of 32,000 significant characters per statement. 4.2 Include Files The INCLUDE statement is supported, and include files may be nested up to 10 levels deep. Files included by the INCLUDE statement are searched for in the following directories: 1st: The directory of the source file that the INCLUDE statement belongs to. 2nd: The current directory when FORTRAN-lint is run. 3rd: (VMS only) The absolute path or logical name specified in the INCLUDE statement. 4th: The directories specified in the "-I" switch, from left to right. 5th: (SUN/UNIX only) The directory "/usr/include". If an include file is not found, an error message is generated and processing continues as best it can. For the FORTRAN programs that utilize the C preprocessor under UNIX, there is also the "#include" directive. This directive is different than the INCLUDE statement, and is described in the C Preprocessor Section. 4.3 C Preprocessor (CPP) (UNIX Only) Some FORTRAN programs utilize the C preprocessor to perform conditional compilation, file inclusion, and macro expansions. FORTRAN-lint has the capability to invoke the C preprocessor on each source file before parsing it, and performing line number translations so the appropriate line numbers will appear on messages. If the C preprocessor is not "/usr/lib/cpp", FORTRAN-lint must be given the full path name of the C preprocessor. This is done by patching the cpp pathname in the "flint" executable with the "flpatch" program. See Appendix A for details on how to do this. The "-D" and "-I" switches are passed to the C preprocessor, to allow for symbol predefinition and include search paths. Arguments following the switches in the preprocessor command line are the input file (the actual FORTRAN source file), and the output file (a temporary filename generated by FORTRAN-lint). All source files with the ".F" (capital F) file name extension are run though the preprocessor. If the "-p" switch is selected, then all source files will be preprocessed regardless of the file extension. Note that the files included by the INCLUDE statement will not be affected by the C preprocessor, because these files are read in directly by the FORTRAN-lint parser and are not preprocessed. 4.4 CDD and DBMS Processing (VMS Only) 4.4.1 CDD (Common Data Dictionary) Declarations The dictionary statement is somewhat similar to the INCLUDE statement in that it includes variable declarations into the current routine. It differs from include files by building the data structures from a CDD dictionary during compilation rather than just reading them from a source file. FORTRAN-lint supports the dictionary statements by using the FORTRAN compiler as a preprocessor to expand these statements. 4.4.2 DBMS Support (FDML statements) FORTRAN-lint supports FDML statements, including the invoke, ready, use, commit, rollback, disconnect, connect, erase, get, modify, fetch, find, free, also, null, within, keep, reconnect, and store statements. The invoke statements are preprocessed by the FORTRAN compiler in the same fashion as the CDD dictionary statement, and all other FDML statements are parsed by FORTRAN-lint. Usage checking is suppressed on variables that are created by the invoke statement. 4.4.3 CDD/DBMS Requirements Dictionary and invoke statements are expanded into their equivalent source code by using the FORTRAN compiler as a preprocessor and analyzing the resulting compiler output files. This requires the FORTRAN compiler and the CDD and/or DBMS packages to be installed and available in order for FORTRAN-lint to be able to process these statements. The compiler is used only if a dictionary or invoke statement is actually present, and then only the dictionary or invoke statement is run through the compiler. 4.5 FORTRAN-77 Extensions FORTRAN-lint is based on the 1978 ANSI FORTRAN-77 standard. It also understands extensions to this standard used by the following compilers: system compiler dialect code ------------------------ --------------------- ------------ FORTRAN ANSI X3.9-1978 ANSI Concurrent OS/32 FORTRAN Version 5.5 OS32 Cray YMP UNICOS CFT77 5.0 CRAY HP9000 Series HPUX FORTRAN/9000 8.05 HPUX NCUBE FORTRAN 77 NCUBE Silicon Graphics IRIS-4D 3.3 FORTRAN 77 SGI SunOS Sun FORTRAN 1.4 SUN VAX/VMS VAX FORTRAN Version 5.0 VAX Extensions supported by FORTRAN-lint include, but are not limited to the following: - Data type size specifiers (eg., integer*4) - Records, structures and maps - Pointers - Debugging lines with "D" or "X" in the first column - TAB formatting - Inline comments, both "!" and ";" styles - Long symbol names, with non-alphanumeric characters - A plethora of binary, octal, and hex constant formats - Hollerith constants - Namelist I/O - Dozens of system-specific I/O statement specifiers - Hundreds of intrinsic functions - All I/O format strings, including embedded expressions - Abbreviated and symbolic expression operators - Recursion - Array sections & array expressions 4.6 Changing the FORTRAN Dialect The FORTRAN dialect of the source code may be specified using the "-V" switch under UNIX or "/SYSTEM=" under VMS. FORTRAN-lint will then allow the language extensions provided by the specified compiler. This switch defaults to the version of FORTRAN for the system FORTRAN-lint is currently running on. Dialects currently supported by this switch are the dialect codes from the system/compiler table in Section 4.5. This allows users to cross develop software for multiple systems on a single platform. This switch is not needed if the default FORTRAN dialect contains all the extensions that will be used by the source program. If what is desired is to flag the program syntax which is not supported by a specific dialect, the "-P" or "/PORTABILITY=" switch should be used instead. 4.7 Default Sizes On systems where integers and logicals are four bytes long by default, the "-2" switch under UNIX or "/NOI4" under VMS can be used to change the default to two bytes. That is, INTEGER and LOGICAL declarations are interpreted as INTEGER*2 and LOGICAL*2. This applies only to type statements without length specifiers and constants which can fit in either size data type. Chapter 5 Controlling Analysis 5.1 Setting the Scope The "-g" switch under UNIX or "/GLOBAL" under VMS will cause FORTRAN-lint to analyze all the FORTRAN sources as a group, rather than individually. This enables interface checking and improves usage checking of variables passed as actual arguments to other routines. If "-g" or "/GLOBAL" is not specified, subprograms are processed on an individual basis, and call interface checking is not performed. 5.2 Message Classification FORTRAN-lint checks for the following five general classes of problems: - syntax problems - subprogram interface problems - variable usage problems - portability problems - implicitly typed variables Syntax problems are constructs that will not compile or that may be interpreted by the compiler in a different way than the programmer intended. This includes symbol names that have embedded blanks, re-declared or re-dimensioned variables, and poorly structured branches using GOTOs. Interface problems are problems with the interaction between subprograms. This includes inconsistent argument lists in function or subroutine calls, inconsistent common block organization, and unused or missing subroutines and functions. Usage problems cover improper use of variables and arrays. Variables should be both set and referenced; any deviation from this is flagged. Attempted redefinition of constants in subprogram calls is also flagged. Portability problems are constructs that are allowed on the host system, but are not recognized or are interpreted differently on other systems. This includes structures, pointers, data type length specifiers, and other extensions. Implicitly-typed variables can be flagged whether or not the "IMPLICIT NONE" statement was used. If "IMPLICIT NONE" was used, they will be categorized as syntax errors. FORTRAN-lint breaks syntax problems, interface problems, data usage problems, and portability problems down into three levels of severity and reports them accordingly: - Error messages are the most serious and indicate that the code will not compile or will probably not operate correctly. - Warning messages flag constructs which may not operate as intended, may cause intermittent problems, or just don't make sense. - FYI (for your information) messages show unused clutter, implied truncations and data type conversions, and naming inconsistencies. 5.3 Selecting Analysis Level The default analysis level is a basic syntax analysis, flagging errors and warnings. Categories of messages may be enabled or suppressed with the following switches: - syntax always enabled - interface "-g" or "/GLOBAL" - usage "-u" or "/USAGE". Enabled by default; improved with "-g" or "/GLOBAL" - portability "-a" or "/ANSI"; "-Psys" or "/PORTABILITY=sys" (see Section 5.5) - implicit "-m" or "/IMPLICIT" Severity level of messages in the above categories is controlled with the following switches: - errors always enabled - warnings "-w" or "/WARNINGS", enabled by default - FYIs "-f" or "/FYI" To disable a category or level, precede the switch with an additional dash (e.g., "--w") under UNIX, or with "NO" (e.g. "/NOWARNINGS") under VMS. Selecting "-gamf" or "/GLOBAL/ANSI/IMPLICIT/FYI" on the command line would perform a very detailed analysis, while "--uw" or "/NOUSAGE/NOWARNINGS" would provide the bare minimum. 5.4 Suppressing Individual Messages The "-O" (omit) switch under UNIX and "/SUPPRESS=" under VMS can be used to selectively suppress individual messages. This can be useful when a category or level of analysis is desired, but a few unwanted messages from that category or level appear so frequently that they clutter the output. The "-O" and "/SUPPRESS=" switches accept message numbers as their arguments. Message numbers are shown in the analysis output between the category/severity and the message text. Multiple instances of the same message have the same number. Message numbers also appear in the error file "flint.err". See Appendix E (Diagnostic Messages) for more details. In addition to message numbers, the "-O" and "/SUPPRESS=" switches accept the word "all" to mean all messages. This suppresses all numbered messages, including syntax errors. If a message number or the word "all" is preceded with a plus sign ("+"), the message or messages are "unsuppressed". This allows a message that was suppressed to be enabled again. An unsuppressed message will be shown only if its analysis category and level were selected. -O arg /SUPPRESS=arg Action ------------- ------------------------ n Suppress message #n all Suppress all messages +n Unsuppress message #n +all Unsuppress all messages For example, the switch "-Oall,+279,+281" or "/SUPPRESS=(all,+279,+281)" will suppress all messages but #279 and #281. Since messages #279 and #281 are interface FYIs, the switches "-gf" or "/GLOBAL/FYI" must also be selected in order for these messages to be output. 5.5 Portability Checking The "-P" switch under UNIX and "/PORTABILITY=" under VMS flag problems that will occur when porting the Fortran code to a different system. This includes constructs which are not recognized or may operate differently on the target system. "-P" and "/PORTABILITY=" take one or more arguments, which are the names of the target systems. These names are those described in Section 4.5 (Fortran-77 extensions), and include ANSI, VAX, SUN, OS32, CRAY, SGI, HPUX, and NCUBE. Portability to multiple targets may be checked at the same time. This is done by specifying multiple system names on the "-P" or "/PORTABILITY=" switch. The "-a" and "/ANSI" switches flag non-ANSI constructs. They have the same effect as "-Pansi" and "/PORTABILITY=ANSI". For example, if a Fortran program is being ported to a VAX system and a CRAY system and the programmer wishes to examine portability issues related to the port, then he would add the switch "-Pvax,cray" or "/PORTABILITY=(VAX,CRAY)" to the FORTRAN-lint command line. Chapter 6 Analysis Output 6.1 Overview When run without any output redirection switches, FORTRAN-lint sends all of its text output to the console (stdout under UNIX, or SYS$OUTPUT under VMS) in the following order: item controlled by -------------------------- ------------------------------ echo selected switches echo selected source files source listing -l -i ( /LISTING /INCLUDE ) analysis output -g -u -m -P -a -w -f -O ( /GLOBAL /USAGE /IMPLICIT /PORTABILITY /ANSI /WARNINGS /FYI /SUPPRESS ) call tree -t -T ( /TREE /TREE= ) cross reference tables -x -X ( /XREFERENCE /XREFERENCE= ) statistics output -s ( /STATISTICS ) Under UNIX, output can be redirected by the shell, or with the "-S" (split) and "-+" (summary mode) redirection switches. Under VMS, redirection can be done by redefining "SYS$OUTPUT" with switches "/OUTPUT", "/SPLIT", and "/SUMMARY". The width and page length of the output can be altered with the "-W" and "-Y" switches under UNIX, or "/WIDTH=" and "/LPP=" under VMS. 6.2 Splitting the Output The output redirection switch "-S" under UNIX or "/SPLIT=" under VMS causes the output to be sent to several different files, rather than to the console. It takes the argument following this switch as the base name of the filenames to redirect the output to. The extensions ".lnt", ".tre", ".xrf", and ".stt" will be appended to this base name to create the output file names. The switches, source files, and analysis output will be sent to the ".lnt" file. If a call tree was selected, it will be output to the ".tre" file. If a cross reference was selected, it will be output to the ".xrf" file. If statistics are selected, they will be output to the ".stt" file. Example: flint -Sprog -t -s myfile.f or flint /SPLIT=PROG/TREE/STATISTICS myfile.f The command line above will create the output files "prog.lnt", "prog.tre", and "prog.stt". 6.3 Summary Mode The "-+" switch under UNIX and "/SUMMARY" under VMS switches are used in conjunction with the "-S" and "/SPLIT=" switches to provide a progress meter while FORTRAN-lint is running, and a brief summary of the results when analysis is completed. The "-+" or "/SUMMARY" progress and summary output is sent to the console, so normal output must be redirected with the "-S" or "/SPLIT=" switch. If the "-S" or "/SPLIT=" switch is not specified, it is implied with "flint" as the base name. This implied redirection will cause the output files to be "flint.lnt", "flint.tre", "flint.xrf", and "flint.stt". During analysis, progress is tracked by showing level of completion from 0% to 100%. Backspaces are output to overwrite and provide a stationary counter. Once analysis is complete, the counter is erased and the first screenful of the message summary is shown. After the message summary, a final line shows total count of messages by level, and the names of the files containing the redirected output. For more detail about summary, see Section 6.5 (Statistics Output). 6.4 Analysis Output 6.4.1 Switches and Filenames The first line of the analysis output shows the FORTRAN-lint revision number and the current date and time. The next few lines show the selected switches, along with where they were specified. - Default options are options that were specified in the "flint.cfg" configuration file in the installation directory. These are the system defaults. - User options are options that were specified in a "flint.cfg" configuration file in the directory named in the environment variable "FLINTCFG". These are a user's custom tailored defaults. - Local options are options that were specified in a "flint.cfg" configuration file in the local directory. These are usually the defaults for a specific project. - Expanded options are options that were specified in a configuration file expanded onto the command line with the "-E" or "/FILES=" (expand) switch. - Command options are options that were placed on the command line. The selected source file names are shown next, grouped by directory. Next is the source listing, then the diagnostic messages. 6.4.2 Source Listing FORTRAN-lint will produce a source listing if the "-l" or "/LISTING" switch is used. If the "-i" or "/INCLUDE" switch is also used, the source listing will expand all the include files where they are included. 6.4.3 Diagnostic Messages FORTRAN-lint generates a diagnostic message for each problem detected within a subprogram. Each message includes the source line and a pointer to the column where the problem appears. Also shown is the name of the source file, the subprogram name, the line number, the message category and severity, the message number, and the message text. A message might look as follows: > CALL DIPSTAT( 4, CURITEM) > ^ demo.f:PRINTIT line 43: INTERFACE ERROR #59- constant is changed by subprogram. Messages are generally output in the order they appear in the source file, and are grouped by subprogram. Each subprogram message group is delimited by a line of asterisks followed by information on where the subprogram begins. This delimiter looks like: ******************************************************** Subroutine PRINTIT File demo.f Line 39 Additional diagnostic messages may be printed after a subprogram is completely processed or after all subprograms are processed; e.g., IMPLICIT- symbols were implicitly typed: A, AQDATA, DELTI USAGE ERROR- local variables referenced but never set: J, K SYNTAX FYI- unused labels: 150 6.5 Statistics Output If the "-s" switch under UNIX or "/STATISTICS" under VMS switch is used, FORTRAN-lint will generate various statistics on the source files, including program size, comment percentage, and diagnostic message summary by number, category, and severity. Appearing first are program size statistics. The number of source files is shown, followed by the number of lines and bytes of code for the source files, the include files, and the total of the two. Counts on "Include files" reflect all appearances of the include files, and will be much higher than that of the include files alone. Total parsed is calculated after all include files are expanded. Byte counts do not include the newline characters. Comment percentage is based on byte counts, and takes both comment lines and inline comments into account. The comment percentage for include files and total parsed is calculated after all include files are expanded. This multiplies the weight of an include file comment by how many times it is included. Number of source files: 1 Source files: 52 lines, 1314 bytes ( 5% comments, 95% code) Include files: 44 lines, 1052 bytes (14% comments, 86% code) Total parsed: 96 lines, 2366 bytes ( 9% comments, 91% code) Shown second are the number of subprograms, broken down by type. Total subprograms: 7 Subroutines: 6 Functions: 0 Program: 1 Block Data: 0 Shown next is the message summary, broken down by message number. Messages are sorted by frequency of appearance. Displayed for each message are its category, severity, number, frequency, and message text. Context-dependant fields in the message text are shown as asterisks (*). Individual message summary ----------------------------------------------------------- INTRFC ERR #57- 2x: too many arguments. INTRFC WARN #63- 2x: expression is changed by subprogram. SYNTAX WARN #47- 1x: branch into do loop via label *. INTRFC ERR #56- 1x: not enough arguments. INTRFC ERR #59- 1x: constant is changed by subprogram. INTRFC ERR #95- 1x: this name is defined as a subroutine. The number of messages is displayed last, shown in total and broken down by category and severity. The code , meaning "suppressed", is shown for message categories and severities that were not selected. Total messages: 18 Errors Warnings FYIs ------ -------- ---- Syntax: 0 1 0 Interface: 8 4 0 Data usage: 2 1 2 Implicit typing: Chapter 7 Call Trees 7.1 Overview If the "-t" switch under UNIX or "/TREE" under VMS is used, FORTRAN-lint produces a call tree which outlines the calling structure of the source files analyzed. A call tree in the default format might look like: FORTRAN-lint (call tree) This is a primary tree starting at the program 'PROCDAT' PROCDAT-+-GETUNIT | +-READNAME | +-SETTYPE--PRINT--PRINTIT-+-DIPSTAT--*PRINT* | | | +-GETUNIT | +-PRINT--PRINTIT-+-DIPSTAT--*PRINT* | +-GETUNIT See Appendix D (Output Samples) for source listing demo.for. 7.2 Tree Options The "-T" or "/TREE=" switch allows the user to customize the call tree with several suboptions. Whenever the "-T" or "/TREE=" switch is used, the "-t" or "/TREE" option is implied. This switch is used in the following format: -Toption,option,option, ... under UNIX or /TREE=(option,option,option, ...) under VMS Where "option" can be replaced with any of the arguments listed in the next subsection. 7.2.1 Arguments The following commands may be given as the arguments to the "-T" and "/TREE=" switches: {no}alphabetic Sorts call tree alphabetically. Calls by a routine are usually shown in the order called. This option sorts those calls into alphabetical order. The condensed option is recommended if this is used. {no}condensed Condenses multiple calls to the same routine. If a routine calls the same routine many times, these calls are merged into one call (Default for prior revisions of FORTRAN-lint). disable Disables the call tree. This has the same effect as "--t" or "/NOTREE", and is simply an alternate way to disable the call tree. enable Enables the call tree. This has the same effect as "-t" or "/TREE", and is simply an alternate way to enable the call tree. graphics=xx:xx: ... Changes the tree graphics characters. The values given are the hex codes for the following shapes: (1) (2) (3) (4) (5) | | | ----- | --+-- +-- +-- | | | The values should be two-digit hex codes separated by colons. For example: graphics=C4:B3:C2:C3:C0 for the IBM extended character set. nographics Restore default shape characters (- | + + +). head:symbol Suppresses the full call tree and shows a call tree with the specified symbol as the top node. Multiple top nodes may be given. help Outputs a help screen on tree commands and terminates FORTRAN-lint. {no}library Shows calls made to routines in the FORTRAN-lint ".lbt" files specified on the command line and/or the ".cfg" file. {no}squish Compresses the tree vertically by removing excess line graphics. Less readable, but takes up half the space. {no}trim Trims the call tree by suppressing repeated subtrees. Trees are trimmed by default. {no}undefined Shows calls made to routines that are undefined in the source code, or libraries. 7.3 Call Tree Format The call tree displays routines, subroutine calls, and function references in a graphical format. The starting routine is shown at the left top of the graph, and each level of routine calls is shown to the right of the calling routine. Each routine is connected to its called routines by lines drawn from dashes, vertical bars, and plus signs. Within each routine, calls are shown in the order they appear in the source code. Routines which are not the program routine and are not called by any other routine are considered "detached". They will not appear in the main tree, but will be shown as the head of their own detached trees. symbol explanation ------- ------------------------------------- ( ) Parenthesis are used to mark undefined routines. { } Brackets are used to mark library routines (from ".lbt" libraries). @ Precedes calls to dummy routines. ** Marks recursive chains that are chopped after the first iteration. 7.3.1 Trimmed Trees The size of call trees grow exponentially with program size. This makes generating a complete call tree of a large program impractical, if not impossible. Trimmed call trees have duplicate subtrees removed, reducing the tree to a manageable size. At each trimmed point is a numerical reference to where a subtree for the routine can be found. FORTRAN-lint, as installed, trims trees by default. The switch "-Ttrim" or "/TREE=TRIM" in the default configuration file sets this default. Full trees can be selected by specifying the "-Tnotrim" or "/TREE=NOTRIM" switch. Example of a trimmed tree: PROCDAT-+-GETUNIT | +-READNAME | +-SETTYPE--PRINT (1)--PRINTIT-+-DIPSTAT--*PRINT* | | | +-GETUNIT | +-PRINT see 1 7.3.2 Condensing Multiple Calls The call tree normally shows all routine calls in the program. If one routine calls another several times, each call will be shown in the tree. If you only want to see the relationships between routines and do not care about the specific number of calls, the "-Tcondensed" or "/TREE=CONDENSED" can be used to show only one call per association. This will show the first time a routine calls another, but will suppress additional calls to the same routine. The calling order is preserved, but will be based only on the first calls to each routine. PROCDAT-+-GETUNIT | +-READNAME | +-SETTYPE--PRINT--PRINTIT-+-DIPSTAT--*PRINT* | | | +-GETUNIT | +-PRINT--PRINTIT-+-DIPSTAT--*PRINT* | +-GETUNIT 7.3.3 Sorting Alphabetically For each routine, calls are normally shown in the order they appear in the source code. If the call ordering is not important, these routine names can be sorted alphabetically for easy look-up. This is accomplished with the "-Talphabetical" switch under UNIX, or "/TREE=ALPHABETICAL" under VMS. Since the call order is lost when sorting alphabetically, the appearance of multiple calls to the same routine will usually not be wanted. Switches "-Tcondensed" and "/TREE=CONDENSED" will suppress these. See Section 7.3.2 for more information. PROCDAT-+-GETUNIT | +-PRINT--PRINTIT-+-DIPSTAT--*PRINT* | | | +-GETUNIT | +-READNAME | +-SETTYPE--PRINT--PRINTIT-+-DIPSTAT--*PRINT* | +-GETUNIT 7.3.4 Squished Trees Call trees are normally double-spaced to aid readability. They can be single-spaced by using the "-Tsquish" or "/TREE=SQUISH" option. Limitations in line-drawing capability of the ASCII character set makes single spaced trees harder to interpret. If an extended ASCII character set with line drawing characters is available, single-spaced trees can look quite presentable. PROCDAT-+-GETUNIT +-READNAME +-SETTYPE--PRINT--PRINTIT-+-DIPSTAT--*PRINT* | +-GETUNIT +-PRINT--PRINTIT-+-DIPSTAT--*PRINT* +-GETUNIT 7.3.5 Graphic Character Set The call tree uses the ASCII characters "-", "|", and "+" to connect the routine names. If an extended ASCII character set is available with line joints, these characters can be used to improve the appearance of the call tree. Alternate graphic characters can be selected with "-Tgraphics=xx:xx:xx:xx:xx" or "/TREE=(GRAPHICS=xx:xx:xx:xx:xx)", where the "xx" are hexadecimal codes for the ASCII characters. Alpha hex characters may be either uppercase or lowercase. All codes must be specified, even if only one or two are changed. The default codes are "-Tgraphics=2d:7c:2b:2b:2b" or "/TREE=(GRAPHICS=2d:7c:2b:2b:2b)" for the characters -, |, +, +, and +. An example is using the "-Tgraphics=c4:b3:c2:c3:c0" option under UNIX, or "/TREE=(GRAPHICS=c4:b3:c2:c3:c0)" under VMS for the IBM extended character set. The default shape codes can be reselected with the "-Tnographics" or "/TREE=NOGRAPHICS" switch. 7.4 Call Tree Content 7.4.1 Top Node Call trees can be generated with any routine as the top routine. When the top routine is selected, the full tree and detached trees are suppressed. The "-Thead:name" or "/TREE=HEAD:name" option will select "name" as the head of the tree. Multiple trees can be selected by giving multiple routine names; eg. "-Thead:PRINT,head:SETTYPE" or "/TREE=(HEAD:PRINT,HEAD:SETTYPE)" will show trees for both "PRINT" and "SETTYPE". FORTRAN-lint (call tree) This is a primary tree starting at the program 'PRINT' PRINT--PRINTIT-+-DIPSTAT--*PRINT* | +-GETUNIT This is a primary tree starting at the program 'SETTYPE' SETTYPE--PRINT--PRINTIT-+-DIPSTAT--*PRINT* | +-GETUNIT If the switch "-Tnohead" or "/TREE=NOHEAD" appears after one of the "-Thead:name" or "/TREE=HEAD:name" switches, the full tree and detached subtrees are restored and "-Thead:name" and "/TREE=HEAD:name" is ignored. 7.4.2 Undefined Routines Undefined routines are subroutines and functions which are called but do not appear in the source code or libraries analyzed. These are normally shown in the call tree with the routine name within parenthesis. These routines can be suppressed with "-Tnoundefined" or "/TREE=NOUNDEFINED" if desired. If "-Tnoundefined" or "/TREE=NOUNDEFINED" was used as a default in a configuration file, the undefined routines can be selected again with the "-Tundefined" or "/TREE=undefined" switch on the command line. 7.4.3 Library Routines Library routines are subroutines and functions whose definition appears in a FORTRAN-lint library (".lbt" file) rather than the source code. These routines will appear in the tree only if they are called from routines in the source code, and if the appropriate library is specified on the command line when the sources are analyzed. Library routines are shown surrounded by curly braces. Call chains are not preserved in libraries, so a library routine will appear as not calling any other routines, even if the library routine did contain routine calls. Library routines can be suppressed from the call tree with the "-Tnolibrary" or "/TREE=NOLIBRARY" switch. If "-Tnolibrary" or "/TREE=NOLIBRARY" was used as a default in a configuration file, the library routines can be selected again with the "-Tlibrary" or "/TREE=LIBRARY" switch. 7.5 Recursion If recursive calls were shown in the call tree, any recursion would cause the tree to grow to infinite size. To prevent this, recursive chains are chopped after the first iteration. Asterisks ("*") surround the recursively called routine to indicate that the chain was truncated. 7.6 Dummy Routines The at ("@") sign before a routine name indicates that a subroutine or function was called indirectly through the argument list of another function. 7.7 Entry Point The ">" symbol in a call tree indicates that the call was made through an entry point. Example: | +-SUB1>ENTRPT | Where ENTRPT is the entry point into subroutine or function SUB1. Chapter 8 Cross Reference 8.1 Overview If the switch "-x" under UNIX or "/XREFERENCE" (cross reference) under VMS is used, FORTRAN-lint generates a cross reference symbol table. Cross reference tables can be generated from the sources, or may quickly be generated from a database file (see chapter 10). The "-X" and "/XREFERENCE=" (cross reference options) switches are used to control the format and content of the cross reference table under UNIX and VMS, respectively. The options that control the cross reference format under UNIX are: -X{no}tabular Selects tabular format (as opposed to freeform) -Xfreeform Selects freeform format -X{no}line Selects line resolution (as opposed to subprogram resolution) -X{no}legend Selects legend for line resolution codes The options that control the cross reference format under VMS are: /XREFERENCE={no}tabular Selects tabular format (as opposed to freeform) /XREFERENCE=freeform Selects freeform format /XREFERENCE={no}line Selects line resolution (as opposed to subprogram resolution) /XREFERENCE={no}legend Selects legend for line resolution codes There are two available formats for the cross reference table: "freeform" and "tabular". The "freeform" cross reference is the default format. It has variable length lines and shows the information in a compact format. The default options for this form are "-Xnoline" and "-Xnolegend" under UNIX, or "/XREFERENCE=noline" and "/XREFERENCE=nolegend" under VMS. The "tabular" cross reference has its fields organized into columns, and is at least 132 characters wide. This form has the defaults "-Xline" and "-Xlegend" under UNIX, or "/XREFERENCE=line" and "/XREFERENCE=legend" under VMS. The "line" or "noline" option sets the cross reference to either line resolution or subprogram resolution, respectively. Subprogram resolution shows usage of a symbol within a subprogram, while line resolution shows usage of a symbol on each line in which that symbol appears. This must be set during source analysis to have effect. Using the "-g" or "/GLOBAL" switch during analysis of the sources collects more information and improves the cross reference. Specifically, dummy argument usage is shown for subroutine and function definitions. In addition, the usage of the variables and arrays that are passed as actual arguments are determined. 8.2 Layout Symbols are grouped into the following categories: - programs - block data modules - subroutines - functions - common blocks - structures - records - variables and arrays - parameters Symbols are sorted alphabetically by name within each group. If a symbol appears in more than one context (e.g., as a variable in one subprogram and as a subroutine name in another), the symbol is shown in both groups. In the tabular format cross reference, the program, block data, subroutine, and function sections are combined, as are the records and variable/array sections. The information shown for each symbol will vary by category. 8.2.1 Program Routines This symbol name is derived from the program name given on a program statement. If an unnamed program routine exists, it is given the name "Program". Multiple unnamed programs are named "Program2, Program3, etc...". The filename and the line number where the program routine begins are shown along with the program name. 8.2.2 Block Data Routines These are the symbol names from block data statements. Like program symbols, unnamed block data subprograms are named "Blockdata", "Blockdata2", etc. The filename and the line number where the block data subprogram begins are shown along with the block data name. 8.2.3 Subroutines and Functions External routines, statement functions, and intrinsic functions are shown in this section, and are labeled correspondingly. For functions, the data type is shown. This is normally the data type of the function definition. If the function is undefined, the data type used by the first function call is used. If the code for the subroutine or function appeared in the sources analyzed, the filename and line number of the subroutine/function statement are shown. If the definition was in a FORTRAN-lint library (".lbt" file), the name of this library is shown. Argument descriptions of external and statement functions are also shown if the "-g" or "/GLOBAL" switch was used during analysis. The argument descriptions show the class, data type, and usage of each argument. Argument class is one of the following: variable array variable or record array subprogram function or subroutine return alternate return --- unused argument Argument usage is shown by the single-letter codes listed below. code description ---- ------------------- S set R referenced (used) X undetermined For external subroutines and functions, called routines are shown. If the table is in tabular format, the line number of each call or function reference is also shown. Finally, all calls to the function or subroutine are listed. In the tabular cross reference, the location of the calls are shown by subprogram, filename, and line number. 8.2.4 Common Blocks Common blocks are shown along with their size (in bytes), and a list of their members. The routines that the common blocks appear in are shown, categorized into the following groups: model the definition used for comparison (shown as "same" if freeform) same same declaration as the model names differ data types and sizes of members match model but have different names layout differs data types or sizes of members do not match the model 8.2.5 Structures The structures used within the program are listed, along with their size and format. Structures of the same name, size, and format will be merged. 8.2.6 Variables, Arrays, and Records Variables, arrays, records, and arrays of records are shown in this section. This includes automatic (local), dummy, and common block members. Arrays are distinguished by the dimension list. Each dimension is shown as either an upper bound or a lower/upper bound pair separated by a colon, depending on whether the lower bound is 1. If the lower or upper bounds are adjustable, "adj" appears. For open ended dimensions, an asterisk ("*") appears as the upper bound. The data type appears next, which includes a length specifier. For records, the name of the associated structure is shown. Next is the scope, which is either "local" or the common block that contains it. For common block members, the location within the common block is also shown. Variables, arrays, or records with the same name, dimensions, data type, and scope (if in common, the same block and position) will be merged. Finally, the cross reference of the symbol is shown. The location resolution is either per subprogram or per line, depending on the setting of the "-Xlinenumbers" or "/XREFERENCE=linenumbers" option when the sources are analyzed. Subprogram resolution will show usage within each subprogram, and is described in words. Line resolution will show usage for each line the symbol appears on, and is described in single-letter codes. Symbol usage is described as one or more of the following: line subprogram resolution resolution codes codes description ---------- -------------- --------------------------- --- Unused Symbol was not referenced, set, or indeterminate A Actual arg Symbol passed as an actual argument B Array bound Symbol was used as an adjustable bound for an array D --- Symbol appeared in a declaration (type decl, dim, common) E Equivalenced Appeared in an equivalence statement F SF Dummy arg Appeared as a statement function dummy argument G Ref as Label An assigned goto jumped to label assigned to this symbol i Indirect Init A symbol equivalenced to this symbol was initialized I Initialized Initialized in data statement, or when given data type L Set to Label Symbol was assigned a label P Dummy arg Symbol appeared in a subroutine or function statement R Ref Symbol was referenced (it's value was used) S Set Symbol was assigned a value X Indeterminate May be ref or set, but exact usage cannot be determined Usage information (Ref/Set) is carried through all variable associations, including actual/dummy argument associations, common block member associations, and equivalences. The default is to suppress unused common blocks. See Section 8.4 for more information. 8.2.7 Parameters Parameters are shown along with their data type and their value. Parameters from different routines which have the same name and the same value will be merged. The following usage codes apply to parameters: line subprogram resolution resolution codes codes description ---------- ---------- -------------------------- D --- Symbol appeared in a declaration (type decl, parameter) R Ref Symbol was referenced (it's value was used) S Set Symbol was assigned a value (parameter statement) The default is to suppress unreferenced parameters. See Section 8.4 for more information. 8.3 Format Selection FORTRAN-lint allows users to select different formats for the cross reference table by using the "-X" option under UNIX, or "/XREFERENCE=" under VMS. Available formats include: -X{no}tabular /XREFERENCE={no}tabular -Xfreeform /XREFERENCE=freeform -X{no}linenumbers /XREFERENCE={no}linenumbers -X{no}legend /XREFERENCE={no}legend A) tabular/notabular/freeform The "-Xtabular" or "/XREFERENCE=tabular" option selects a table style with cross reference data appearing at fixed columns. Output is 132 or more columns wide. The default line numbering option for this format is "-Xlinenumbers" or "/XREFERENCE=linenumbers". "-Xfreeform" or "-Xnotabular" under UNIX, and "/XREFERENCE=freeform" or "/XREFERENCE=notabular" under VMS select a more compact style with data separated by single spaces. The width is the same as in analysis output. The default line numbering option for these formats is "-Xnolinenumbers" or "/XREFERENCE=nolinenumbers". The default format is "-Xfreeform" or "/XREFERENCE=freeform". B) linenumbers/nolinenumbers Selecting "-Xlinenumbers" or "/XREFERENCE=linenumbers" increases the amount of information shown in the cross reference by giving the line number of each appearance of a symbol. Selecting "-Xnolinenumbers" or "/XREFERENCE=nolinenumbers" limits the resolution of the cross reference to the subprogram level. This option must be selected after the "-Xtabular", "-Xnotabular", "-Xfreeform", "/XREFERENCE=tabular", "/XREFERENCE=notabular", or "/XREFERENCE=freeform" option to be effective. Note that if users want to generate a database file (".fdb"), "-Xlinenumbers" or "/XREFERENCE=linenumbers" must be selected besides the "-B" or "/DATABASE=" option to create a database effectively. C) legend/nolegend When "-Xlinenumbers" or "/XREFERENCE=linenumbers" is selected, usage descriptions are represented by single letter codes. These are described in a legend at the end of the cross reference table. This legend may be suppressed with the "-Xnolegend" or "/XREFERENCE=nolegend" option. It may be selected again with "-Xlegend" or "/XREFERENCE=legend". This option must be selected after the "-Xtabular", "-Xnotabular", "-Xfreeform", "/XREFERENCE=tabular", "/XREFERENCE=notabular", or "/XREFERENCE=freeform" option to be effective. 8.4 Content Selection Content selection arguments to "-X" or "/XREFERENCE=" are sentence fragments composed of one to six words, separated by underlines or dashes. Each sentence fragment describes a criteria which can be used to select, add to, or filter the cross reference table output. A complete content selection includes the following words as its arguments: Under UNIX: -X{conjunction}{_usage}{_scope}{_class}{_named_xxx} Under VMS: /XREF={conjunction}{_usage}{_scope}{_class}{_named_xxx} CONJUNCTIONS USAGE-ADJECTIVE SCOPE-ADJECTIVE CLASS-NOUN ------------ ----------------- ---------------------- ----------- only (D) used/unused local routines and ref/unref dummy/nondummy programs no set/unset statement/nonstatement subroutines called/uncalled intrinsic/nonintrinsic functions indeterm/determ global blockdata actual/notactual common/noncommon extern init/uninit external/nonexternal blocks decl/undecl structures equiv/unequiv variables scalars arrays records parameters While any of the words composing the criteria sentence is optional, the order of the words is significant. All words may be abbreviated as long as they remain unambiguous. A few examples are: example result --------------------------- ------------------------- -Xno_unused_variables Suppress unused variables -Xand_par_named_+oo Also show parameters with names ending in "oo" -Xonly_ref_dum_var_nam_i Show referenced dummy variables named "i" /XREFERENCE=common_arrays Show arrays in common blocks /XREFERENCE=arr_named_a?b+c Show arrays named a{any-letter} b{zero-or-more-letters}c (1) The conjunction, if specified, must be first. This word specifies whether the criteria sentence is a selection, filter, or addition. The default is a selection. word type description ---- --------- ----------------------------------- ONLY selection suppress everything but the following (default) NO filter suppress the following AND addition add the following to what is already selected (will not be subject to previous filter criteria) (2) The usage adjective, if specified, must be next. This word acts on symbols at the subprogram level. If a symbol is used in a particular subprogram in the fashion described by the usage adjective, the use of that symbol within the subprogram is included in the selection. If the usage adjective is omitted, usage is not used in determining the selection. word antonym description ------------- --------------- ----------------------- used unused (referenced, set, called, or indeterminate) referenced unreferenced set unset called uncalled indeterminate determinate actualarg notactualarg (variables passed to external routines) initialized uninitialized declared undeclared (data type, dimensions, or common) equivalenced unequivalenced Filtering acts on references at a subprogram level, filtering out the references to a symbol that match the filter criteria. If all references to a symbol are filtered out, then the symbol itself is suppressed. (3) The scope adjective, if specified, must be next. This is used in a similar fashion to the usage adjective, but relates to the scope of the symbol. If the scope adjective is omitted, scope is not used in determining the selection. word antonym description ------------- -------------- ------------------------ local - Dummy, Statement, Intrinsic, or Automatic dummy nondummy Dummy argument statement nonstatement Statement function intrinsic nonintrinsic Intrinsic function global - Common or External common noncommon Common block or common block member external nonexternal External routine (4) The class noun, if specified, must be next. This specifies the class of the symbol. The class noun describes categories of symbols. If the class noun is omitted, the selection contains all categories of symbols, limited by the usage and scope adjectives. class subclasses description ------------ ------------- -------------------- routines Includes programs, subroutines, etc... programs subroutines Includes dummy subroutines functions Includes statement, dummy, and intrinsic functions blockdata external External routines which are undefined and unused blocks - Common blocks structures - variables Includes scalars, arrays, and records scalars Single-valued variables arrays records Structured records parameters - Defined in parameter statement Each class contains all its subclasses. (5) The symbol name is specified last. This is composed of two words, the word "named" followed by the actual symbol name. The following wildcards are allowed: * or + matches zero or more characters ? or . matches one character These wildcards may be combined in any fashion. Example: -Xnamed_ab+f.h under UNIX or /XREFERENCE=named_ab+f.h under VMS The default content of the cross reference table is everything except unused common variables and unreferenced parameters. Some more examples: -Xno_intrinsic Suppress intrinsic functions. -Xuncalled_routines Only routines that have not been called. -Xand_unused_parameters Show unused parameters, too. -Xno_unused_common_variables Do not show declarations of common variables where they are unused (if it's never used, the symbol name is not shown). /XREFERENCE=routines Only show routine names. /XREFERENCE=no_common Suppress common blocks and common block members /XREFERENCE=unset_functions Show only undefined functions. /XREFERENCE=unused_dummy_arrays Show array dummy arguments that are unused. Multiple phrases may be given, which are checked in order from left to right. The phrases may be either on the same switch or on separate switches. Example: /XREFERENCE=routines,and_common_blocks This will show routines and common blocks. Example: -Xset_variables -Xno_unref_common_arrays -Xand_init_common_var This will show set variables that are not unreferenced array common block members, and any common block members that are initialized. Remember, the default conjunction is "only". The following example will produce unexpected results: -Xused_variables -Xequivalenced_variables or /XREFERENCE=used_variables /XREFERENCE=equivalenced_variables If the intent is to produce a cross reference table with only variables that are used or equivalenced, then the above command line option will not work. The second argument "equivalenced_variables" will override the first argument "used_variables" since the default conjunction is "only". The cross reference table produced by this option will only include equivalenced variables. The above option should be rewritten as follows: -Xused_variables -Xand_equivalenced_variables or /XREFERENCE=used_variables /XREFERENCE=and_equivalenced_variables Chapter 9 Library Support 9.1 Using Library Files FORTRAN-lint searches library files specified on the command line to check the interface of calls to routines not defined in the source. All files specified with the extension ".lbt" are assumed to be FORTRAN-lint created libraries. If all specified libraries have been searched and an undefined routine could not be found in any of them, libraries "unixlib.lbt" and "vmslib.lbt" are searched on the UNIX and VMS systems, respectively. 9.2 Creating Library Files You can create or update any FORTRAN-lint library file in the following manner. Under UNIX: flint -L mylib.lbt file1.f file2.f ... Under VMS: flint /LIBRARY=mylib.lbt file1.for file2.for ... These commands add all routines in the source files "file1.f file2.f ..." (or "file1.for file2.for ...") to the library "mylib.lbt". If the file "mylib.lbt" is already present, it will be updated. Otherwise, a new library will be created. Source files should be debugged before "flint -L" or "flint /LIBRARY=" is used, as the "-L" and "/LIBRARY=" options cause FORTRAN-lint to run in a special mode, bypassing the normal analysis with reporting errors. If a library routine is modified and the library needs to be updated, simply repeat the command used to create the library, using the proper source file and library file names. The library will be updated to include the new definitions of routines in the source file. Other routines in the library will be left alone. It is important to update your library whenever the library sources are modified. 9.3 Miscellaneous Library Issues 9.3.1 Interaction with Cross Reference and Call Trees The cross reference table and the call tree automatically include referenced library routines. In the cross reference table, each appearance of a library function is preceded by its associated library name. Library functions are marked within the call tree with curly braces ("{ }"). 9.3.2 Library File Format To avoid possible formatting problems, library files are presently revision locked. FORTRAN-lint will give a warning message if incompatible library files are used. 9.4 Creation of Library Routine Shells In order to allow FORTRAN-lint to check parameter passing between FORTRAN subroutines and library routines (particularly package routines), it is necessary for FORTRAN-lint to have something to look at which shows the structure of the routine call, the type of value returned and, of course, the arguments which need to be passed by the calling routine to the called routine. In the case of most package software routines, the source code is not available for FORTRAN-lint to "look at". Therefore, the creation of a "shell" file is necessary. A "shell" file defines the calling interface of the library routines. The FORTRAN-lint package includes ASCII text files "vmslib.lsh" and "unixlib.lsh" ("unixlib.F" for compilers supporting CPP under UNIX). flint -L unixlib.lsh unixlib.lbt under UNIX or flint /LIBRARY=vmslib.lsh vmslib.lbt under VMS The required elements of a shell are: (1) definition of the return value (2) name of the function (3) the dummy argument list. The data type of the dummy arguments and their usage need to be defined within the shell of the function. Switches on the arguments have been designed to allow FORTRAN-lint to handle the shell more efficiently. Function argument switches may only be used on the arguments in function shells, not in subroutine shells. Available switches include: /v Parameter passed by value. [call foo(%val(3))] /q Suppress error #251 (scalar passed to array) and data type checking. This switch is used to allow binary data to be passed in any form without the data type being checked. For example, a quadword may be passed in any of the following forms: LOG*1 FOO(8), INTEGER*2 FOO(4), or INTEGER*4 FOO(2). /z Suppress all interface checking with regards to this argument. The argument is of unspecified data type. /o This argument is optional. [call foo(a,,b,,c,d)] Optional argument switches: /l The rest of the argument list starting from the current argument with this "/l" switch is optional. This allows for variable length argument lists to be handled. /s This argument is set in the function. /r This argument is referenced in the function. /i This argument is indeterminate. Each "shell" is a simple FORTRAN subprogram that takes the same arguments as the associated library subprogram and references or sets these arguments in a similar fashion. Examples below show the structure of some of the FORTRAN library shells found in "unixlib.lbt". integer function signal (signum/r, proc, flog/r) integer signum, flag external proc call proc end real function r_copysign (x/r, y/s) real x,y end The following example tells FORTRAN-lint that only the first two arguments in the argument list are required; the rest of them are optional. Note that arguments CLASS1, CLASS2, CLASS3, and CLASS4 all need to specify the "/l" switch. INTEGER FUNCTION STUDENT (NAME/r, CREDITS/r, CLASS1/rl, CLASS2/rl, CLASS3/rl, CLASS4/rl) CHARACTER*40 NAME INTEGER CREDITS INTEGER CLASS1, CLASS2, CLASS3, CLASS4 END Chapter 10 Database and ".fdb" Files 10.1 What Are ".fdb" Files Files with extension ".fdb" are the database files generated by FORTRAN-lint for source code analysis. These database files contain the information on all symbols. They can be used by FORTRAN-lint and Xlint to regenerate symbol table cross reference information, call trees, and source analysis messages, at a later time without having to reanalyze the source code. 10.2 How to Create ".fdb" Files Database files are created by using the "-B" switch under UNIX, or "/DATABASE=" under VMS. For example: flint -Bdbfile source.f or flint /DATABASE=dbfile source.for where "dbfile" can be substituted with any name the user wishes for the database. The extension ".fdb" will be automatically added to the filename. If the database already exists, it will be overwritten. This command can be run on a single file, or a list of files, so that interaction between several sources can be checked. To reference a database file, simply place the database filename on the command line. Any file with the ".fdb" extension is assumed to be a database file. Any other source filenames will be ignored. Only one database may be queried at a time. Example: flint -t dbfile.fdb or flint /TREE dbfile.fdb where "dbfile.fdb" is a database file that has been created prior to this query. All call tree options are available when operating on database files. All cross reference options are available, with a few exceptions, the "-Xline" or "/XREFERENCE=line" option will be ignored, and will revert to the value set when generating the database file. Example: If database file "dbfile.fdb" was created without specifying "-Xline" or "/XREFERENCE=line", and later this database is referenced for the cross reference information as in: flint -Xline dbfile.fdb or flint /XREFERENCE=line dbfile.fdb Users will not get the complete cross reference information because the information is based on "dbfile.fdb" and thus options "-Xline" and "/XREFERENCE=line" have no effect. Also, if unreferenced parameters or unused common block members are not selected when creating the database file, they will not be available in subsequent cross reference queries. Using the "-B" or "/DATABASE=" switch has no effect on operations other than to create a database file. It is important that ".fdb" files must be regenerated whenever users' source code is modified, so that the diagnostic information stored in the database will reflect the latest sources. 10.3 ".fdb" and Xlint 10.3.1 What Is Xlint Xlint is a Motif based programming tool developed by IPT. It is designed to provide FORTRAN developers with an interactive graphical user interface to browse FORTRAN source files. Xlint operates on the databases (".fdb" files) generated by FORTRAN-lint, and allows programmers to interactively generate call trees with various options, or to perform interactive queries on the cross reference table. Note that Xlint requires FORTRAN-lint version 2.95 or greater. 10.3.2 Creating ".fdb" Files for Xlint To create a ".fdb" database file for Xlint to use, the following options should be selected: 1) "-g" under UNIX "/GLOBAL" under VMS This option must be specified for global analysis to enable checking for consistencies between subprograms, such as argument lists and common blocks. It also improves usage checking and cross referencing of the arguments used in a function or subroutine call. 2) "-Xline" under UNIX "/XREFERENCE=LINE" under VMS This option must be specified to enable the line resolution, as opposed to subprogram resolution. Xlint always includes line numbers for the source code, error messages, and cross reference information. 3) "-Oall" under UNIX "/SUPPRESS=ALL" under VMS Users can use this option to suppress the output of the error messages to the screen. Example: flint -Xline -g -Oall -Bdbfile file.f or flint /XREF=LINE /GLOBAL /SUPPRESS=ALL /DATABASE=dbfile file.for where "dbfile" is a user specified name for the database file. The ".fdb" extension will be automatically attached to the filename. Chapter 11 CADRE Teamwork Support 11.1 Overview FORTRAN-lint is now capable of generating a call tree format compatible with CADRE's Teamwork environment. The new command line option "-Cteamwork=treefile" under UNIX or "/CADRE=teamwork:treefile" under VMS will create a file called "treefile" that can be used as input for building a Teamwork/SD model. It is assumed that the user is familiar with CADRE's Teamwork/FORTRAN Rev environment and its reverse engineering capabilities. 11.2 Configuration For a seamless integration of FORTRAN-lint into Teamwork, a parser script "frev_script" is included with the FORTRAN-lint package. This script can replace CADRE's "frev_parser" program. When frev is invoked, it will use FORTRAN-lint as the front-end parser instead of FORTRAN Rev configuration file. The environment variable/logical FREV_PARSER_NAME defined in the Teamwork/FORTRAN Rev configuration file will need to be altered to point to FORTRAN-lint's invocation script. For example, under UNIX: FREV_PARSER_NAME=/cadre/tool_kit/frev_parser -parser_opt "%t.parser_opt" -pp_opt "%t.pp_opt" -call_tree %t.call_tree -files -%t.files This line needs to be changed to the following: FREV_PARSER_NAME=$FLINTHOME/frev_script -parser_opt "%t.parser_opt" -pp_opt "%t.pp_opt" -call_tree %t.call_tree -files %t.files Make sure the environment variable/logical FLINTHOME is defined and pointing to the correct FORTRAN-lint directory. Command line options can be passed to FORTRAN-lint using the "parser_opt" command line option on frev. Example: frev -model MODEL_NAME -call_tree TREE_NAME -files *.f -config CONFIG_file -parser_opt "-uw -xsfg -Xtabular" Where "-us -xsfg -Xtabular" are the command line options for FORTRAN-lint to perform global analysis with informational messages turned on while producing program statistics and tabular cross reference table. By default, warnings and data usage messages are turned off in the file "frev_script". For example, under UNIX, "frev_script" contains the following line: $PARSER --u --w $OPTIONS -E $FILES -Cteamwork=$CALL_TREE The above line invokes FORTRAN-lint with a default set of options. Users can modify "frev_script" to add or delete options from the FORTRAN-lint command line. Appendix D Output Samples D.1 Sample FORTRAN Program C 'PROCDAT' PROGRAM PROCDAT INTEGER IUNIT, PUNIT INCLUDE 'demo.inc' DO 100 I = 1, 5 50 CALL GETUNIT( I+5, IUNIT, PUNIT) CALL READNAME( CURITEM.NAME, CURITEM.DIMENSIONS) CALL SETTYPE( CURITEM) CALL PRINT( CURITEM, IUNIT) 100 CONTINUE IF (IUNIT .EQ. 23) GO TO 50 END C 'GETUNIT' SUBROUTINE GETUNIT( UNIT, UNIT1) INTEGER UNIT, UNIT1 READ (UNIT1,*) UNIT END C 'READNAME' SUBROUTINE READNAME( NAME, DIMS) CHARACTER*(*) NAME INTEGER INUSE, STATUS COMMON /BLOCK/ INUSE, STATUS REAL*8 DIMS(3) READ (5, *) NAME, DIMS END C 'SETTYPE' SUBROUTINE SETTYPE( CURITEM) INCLUDE 'demo.inc' CURITEM.TYPE = CURITEM.DIMENSIONS(2) IF (CURITEM.TYPE .GT. 5) CALL PRINT( CURITEM) END C 'PRINT' SUBROUTINE PRINT( CURITEM, IUNIT) INCLUDE 'demo.inc' IF (CURITEM.TYPE .NE. COUNT) CALL PRINTIT( IUNIT, CURITEM) END C 'PRINTIT' SUBROUTINE PRINTIT( IUNIT, CURITEM) INCLUDE 'demo.inc' IF (IUNIT .EQ. INUSE) THEN STATUS = 2 CALL DIPSTAT( 4, CURITEM) CALL GETUNIT( INUIT, 3) END IF WRITE (IUNIT,*) CURITEM.TYPE END C 'DIPSTAT' SUBROUTINE DIPSTAT( ISTAT, CURITEM) ISTAT = PRINT( CURITEM, 1) END C <<< DEMO.INC >>> STRUCTURE /ITEM/ CHARACTER*10 NAME INTEGER TYPE REAL DIMENSIONS(3) END STRUCTURE RECORD /ITEM/ CURITEM INTEGER INUSE*2, STATUS, COUNT, TIME COMMON /BLOCK/ INUSE, STATUS COMMON /BK2/ COUNT, TIME D.2 Analysis Output Under UNIX: FORTRAN-lint Rev 3.00 21-Feb-94 10:19:10 Local options: -w -u -O207,276,76,261 --t -Xno_unreferenced_parameters -Xno_unused_common_variables Command options: -Xtabular -x demo.f ***************************************************************** Program PROCDAT File demo.f Line 2 > IF (IUNIT .EQ. 23) GO TO 50 > ^ demo.f:PROCDAT line 11: SYNTAX WARNING #47- branch into do loop via label 50. ***************************************************************** Under VMS: FORTRAN-lint Rev 3.00 22-Feb-94 14:21:46 Page 1 Default options: /WARNINGS /USAGE /SUPPRESS=207,276,76,261 /TREE=trim /XREF=no_unreferenced_parameters, no_unused_common_variables Command options: /STATISTICS /TREE /XREF /OUTPUT=c1.out DEMO.FOR;300 ***************************************************************** Program PROCDAT File DEMO.FOR Line 2 > IF (IUNIT .EQ. 23) GO TO 50 > ^ DEMO.FOR:PROCDAT line 11: SYNTAX WARNING #47- branch into do loop via label 50. ***************************************************************** D.3 Statistics Output >>> Statistics: Number of source files: 1 Source files: 50 lines, 1276 bytes ( 6% comments, 94% code) Include files: 44 lines, 1052 bytes (14% comments, 86% code) Total parsed: 94 lines, 2328 bytes (10% comments, 90% code) Total subprograms: 7 Subroutines: 6 Functions: 0 Program: 1 Block Data: 0 Individual message summary -------------------------- SYNTAX WARN #47- 1x: branch into do loop via label *. Total messages: 1 Errors Warnings FYIs ------ -------- -------- Syntax: 0 1 Interface: Data usage: 0 0 Implicit typing: D.4 Call Tree This is a primary tree starting at the program 'PROCDAT' PROCDAT-+-GETUNIT | +-READNAME | +-SETTYPE--PRINT (1)--PRINTIT-+-DIPSTAT--*PRINT* | | | +-GETUNIT | +-PRINT see 1 D.5 Freeform Cross Reference ******** SYMBOL TABLE ******** *** Program: PROCDAT : defined at line 2 of demo.f Calls- demo.f:GETUNIT, demo.f:READNAME, demo.f:SETTYPE, demo.f:PRINT *** Subroutines: DIPSTAT : defined at line 48 of demo.f Calls- demo.f:PRINT Called by- demo.f:PRINTIT GETUNIT : defined at line 14 of demo.f Called by- demo.f:PROCDAT, demo.f:PRINTIT PRINT : defined at line 33 of demo.f Calls- demo.f:PRINTIT Called by- demo.f:PROCDAT, demo.f:SETTYPE, demo.f:DIPSTAT PRINTIT : defined at line 38 of demo.f Calls- demo.f:DIPSTAT, demo.f:GETUNIT Called by- demo.f:PRINT READNAME : defined at line 19 of demo.f Called by- demo.f:PROCDAT SETTYPE : defined at line 27 of demo.f Calls- demo.f:PRINT Called by- demo.f:PROCDAT *** Common blocks: BK2 : size = 8 bytes : Members- COUNT, TIME Defined in- demo.f:PROCDAT, demo.f:SETTYPE, demo.f:PRINT, demo.f:PRINTIT BLOCK : size = 6 bytes : Members- INUSE, STATUS Defined in- demo.f:PROCDAT, demo.f:READNAME, demo.f:SETTYPE, demo.f:PRINT, demo.f:PRINTIT *** Structures: ITEM : size = 26 bytes : Format- CHAR*10, I*4, R*4 *** Records: CURITEM : struct ITEM : local in (demo.f:PROCDAT) is Indeterminate, Actual arg in (demo.f:SETTYPE) is Dummy arg, Ref, Set, Indeterminate, Actual arg in (demo.f:PRINT) is Dummy arg, Ref, Indeterminate, Actual arg in (demo.f:PRINTIT) is Dummy arg, Ref, Indeterminate, Actual arg *** Vars/Arrays: COUNT : I*4 : bytes 0-3 of common /BK2/ in (demo.f:PRINT) is Ref CURITEM : R*4 : local in (demo.f:DIPSTAT) is Dummy arg, Indeterminate, Actual arg DIMS (3) : R*8 : local in (demo.f:READNAME) is Dummy arg, Set I : I*4 : local in (demo.f:PROCDAT) is Ref, Set INUIT : I*4 : local in (demo.f:PRINTIT) is Indeterminate, Actual arg INUSE : I*2 : bytes 0-1 of common /BLOCK/ in (demo.f:PRINTIT) is Ref ISTAT : I*4 : local in (demo.f:DIPSTAT) is Dummy arg, Set IUNIT : I*4 : local in (demo.f:PROCDAT) is Ref, Indeterminate, Actual arg in (demo.f:PRINT) is Dummy arg, Indeterminate, Actual arg in (demo.f:PRINTIT) is Dummy arg, Ref NAME : CHAR*(*) : local in (demo.f:READNAME) is Dummy arg, Set PUNIT : I*4 : local in (demo.f:PROCDAT) is Indeterminate, Actual arg STATUS : I*4 : bytes 2-5 of common /BLOCK/ in (demo.f:PRINTIT) is Set UNIT : I*4 : local in (demo.f:GETUNIT) is Dummy arg, Set UNIT1 : I*4 : local in (demo.f:GETUNIT) is Dummy arg, Ref D.6 Tabular Cross Reference ******** SYMBOL TABLE ******** *** Subroutines: Name Class Type Definition ----------------------------------------------------------------- /---Calls---\ /--------References---------\ Arguments Line-Subprog Subprog File Line ----------------------------------------------------------------- DIPSTAT subroutine demo.f line 48 49-PRINT PRINTIT demo.f 42 ----------------------------------------------------------------- GETUNIT subroutine demo.f line 14 PROCDAT demo.f 6 PRINTIT demo.f 43 ----------------------------------------------------------------- PRINT subroutine demo.f line 33 35-PRINTIT PROCDAT demo.f 9 SETTYPE demo.f 30 DIPSTAT demo.f 49 ----------------------------------------------------------------- PRINTIT subroutine demo.f line 38 42-DIPSTAT PRINT demo.f 35 43-GETUNIT ----------------------------------------------------------------- PROCDAT program demo.f line 2 6-GETUNIT 7-READNAME 8-SETTYPE 9-PRINT ----------------------------------------------------------------- READNAME subroutine demo.f line 19 PROCDAT demo.f 7 ----------------------------------------------------------------- SETTYPE subroutine demo.f line 27 30-PRINT PROCDAT demo.f 8 ----------------------------------------------------------------- *** Common blocks: Name Size Members Consistency References ----------------------------------------------------------------- BK2 8 COUNT TIME model PROCDAT same SETTYPE PRINT PRINTIT ----------------------------------------------------------------- BLOCK 6 INUSE STATUS model PROCDAT same READNAME SETTYPE PRINT PRINTIT ----------------------------------------------------------------- *** Structures: Name Size Fields ----------------------------------------------------------------- ITEM 26 CHAR*10, I*4, R*4 ----------------------------------------------------------------- *** Vars/Arrays: Name Type Attributes Subprogram File References ----------------------------------------------------------------- COUNT I*4 bytes 0-3 of common /BK2/ PRINT demo.f 34-D 35-R ----------------------------------------------------------------- CURITEM struct ITEM local PROCDAT demo.f 4-D 7-XA 8-XA 9-XA SETTYPE demo.f 27-P 28-D 29-RS 30-RXA PRINT demo.f 33-P 34-D 35-RXA PRINTIT demo.f 38-P 39-D 42-XA 45-R ----------------------------------------------------------------- CURITEM R*4 local DIPSTAT demo.f 48-P 49-XA ----------------------------------------------------------------- DIMS R*8 (3) local READNAME demo.f 19-P 23-D 24-S ----------------------------------------------------------------- I I*4 local PROCDAT demo.f 5-RS 6-R ----------------------------------------------------------------- INUIT I*4 local PRINTIT demo.f 43-XA ----------------------------------------------------------------- INUSE I*2 bytes 0-1 of common /BLOCK/ PRINTIT demo.f 39-D 40-R ----------------------------------------------------------------- ISTAT I*4 local DIPSTAT demo.f 48-P 49-S ----------------------------------------------------------------- IUNIT I*4 local PROCDAT demo.f 3-D 6-XA 9-XA 11-R PRINT demo.f 33-P 35-XA PRINTIT demo.f 38-P 40-R 45-R ----------------------------------------------------------------- NAME CHAR*(*) local READNAME demo.f 19-P 20-D 24-S ----------------------------------------------------------------- PUNIT I*4 local PROCDAT demo.f 3-D 6-XA ----------------------------------------------------------------- STATUS I*4 bytes 2-5 of common /BLOCK/ PRINTIT demo.f 39-D 41-S ----------------------------------------------------------------- UNIT I*4 local GETUNIT demo.f 14-P 15-D 16-S ----------------------------------------------------------------- UNIT1 I*4 local GETUNIT demo.f 14-P 15-D 16-R ----------------------------------------------------------------- ------------------ LEGEND ------------------ P - dummy argument D - declaration R - referenced S - set I - initialized i - initialized indirectly X - usage cannot be determined A - actual argument B - used as an assumed bound L - used as a label in an assign statement G - used as a label in a goto statement F - statement function dummy argument E - equivalenced -------------------------------------------- Appendix E Diagnostic Messages E.1 Format FORTRAN-lint's diagnostic messages are defined in a text file "flint.err". This file contains one message per line in the following format: ### XX --------------------------------- where ### is a three-digit message number XX is a two-letter diagnostic code ----------------------------- is the message text Example: 157 SE no matching "(". The message number may be less than three digits long, but it must be right-justified in a three column field. The first letter of the diagnostic code specifies a basic error category as follows: letter kind of problem ------ --------------------------- 'S' syntax 'U' data usage 'I' call interface 'P' portability 'M' implicit typing 'O' overflow (limit exceeded) The second letter of the diagnostic code specifies a severity level as follows: letter kind of problem ------ ---------------- 'E' error 'W' warning 'F' hint (FYI) Lines that begin with an "I" are not diagnostic messages, but contain the control information used during portability checking to select diagnostic messages. E.2 Diagnostic message list The following is the list of the diagnostic messages for FORTRAN-lint version 3.00: syntactical errors: 2 SE illegal character in label field. 3 SE expected symbol name. 5 SE missing "/". 6 SE illegal character. 17 SE missing "(". 7 SE missing ")". 10 SE filename must be enclosed in quotes. 16 SE illegal delimiter after array subscript. 20 SE extra characters following an otherwise valid statement. 21 SE unexpected end of line. 25 SE illegal character after argument. 28 SE not a fortran statement. 29 SE missing "." after logical constant. 33 SE expected "=". 36 SE missing delimiter (expected a comma). 43 SE missing label. 42 SE missing expression. 62 SE not enough chars in hollerith (only %0 of %1). 64 SE expected 'TO'. 67 SE unterminated string. 69 SE this is not a valid constant. 70 SE missing operand. 71 SE missing operator after period. 72 SE unknown operator after period. 73 SE missing period after operator. 75 SE missing '>' 77 SE illegal value for repeater. 87 SE expected ':'. 99 SE expected a ',' or a '/'. 107 SE illegal character after argument in function call. 108 SE illegal character after argument in subroutine call. 109 SE missing "THEN". 157 SE no matching "(". 199 SE no preceding line to continue from. 98 SE exceeded internal limit of %0 continuation lines. 262 SE label field of continuation line must be blank. 12 SE invalid length specifier. 150 SE missing structure name. 151 SE missing field name. 188 SE missing constant list. 231 SE the %0 i/o specifier requires a value 232 SE unknown i/o specifier %0. 283 SE bad value for length specifier. 284 SE variable expression where constant required. 32 SE missing constant (expected .TRUE. or .FALSE.) 15 SW symbol name %0 is split onto a continuation line. 19 SW symbol name %0 is broken by whitespace. data and symbol classification errors: 8 SE fixed value data item not allowed here. 9 SE symbol %1 previously used and implicitly typed as %0. 14 SW symbol %1 re-declared with the same data type %0. 244 SE symbol %2 previously declared as %0, now %1. 11 SE array %0 redimensioned with different dimensions. 242 SW array %0 redimensioned with same dimensions. 13 SE only a variable or array may be initialized in a data statement. 18 SE illegal program name. 22 SE symbol name already used. 23 SE maximum of 20 dimensions. 24 SE bad symbol name. 26 SE illegal label. 38 SE not a structure name. 40 SE subprogram name not allowed here. 37 SE subroutine name not allowed here. 41 SE duplicate dummy argument names in statement function. 44 SE illegal use of statement function dummy argument. 50 SE dummy argument not allowed in a common block. 52 OO maximum of 256 statement function dummy arguments. 58 SE illegal argument. 65 SE parameter already assigned a value. 68 SE structure name already used. 88 SE variable is already in common block /%0/. 115 SE function reference not allowed here. 116 SE illegal dummy argument in statement function. 144 SE statement function dummy argument should be a variable. 120 SE structure reference not allowed here. 145 SE program name not allowed here. 146 SE block data name not allowed here. 147 SE not a valid field name. 167 SE this symbol was declared as an array. 445 SE array referenced with too many subscripts. 169 SE character string %0 subscript out of bounds. 170 SE nonconstant subscript where constant required. 171 SE invalid equivalence of common block members %0 and %1. 172 SE equiv of %0 and %1 back-extends common /%2/ by %3 bytes. 173 SE %0 is inconsistently equivalenced to itself thru %1. 174 SE scalar variable %0 referenced with %1 subscript(s). 175 SE reference to %0-dimensional array %1 with %2 subscript(s). 176 SW subscript #%1 of array %0 out of bounds.{except case in #275} 275 SF subscript #%1 of array %0 out of bounds (declared as single element).{highest dimension, single element, passed array} 178 SE lower bound greater than upper bound in array declaration. 267 SE unclosed structure block. 197 SE dummy argument not allowed here. 259 SW length of initializer list exceeds variable list by %0 items (after %1). 260 SW list of initialization constants is short by %0 items (no value for %1). 27 SE this variable should not have an array subscript. 158 SE not an intrinsic function. 123 SE right bound less than left bound in character substring. 148 SE no matching structure statement for this end structure. 149 SE field-namelist allowed only in nested structures. 152 SE this field should not have a subscript. 180 SE constant required here. 229 SE equivalenced symbol %0 is not a variable or array. 233 SW symbol of type %0 used as pointer (forced to %0). 234 SE pointer variable cannot be an array. 235 SE a pointer variable cannot be pointer based. 236 SE symbol %0 already based by pointer %1. 263 SE a common block member cannot be pointer based. 264 SE a dummy argument cannot be pointer based. 266 SE this symbol not allowed as a pointer based variable. 237 SE external subprogram name not allowed here. 238 SE a pointer variable cannot be a record. 239 SE cannot equivalence function variable. 240 SE cannot equivalence dummy argument. 241 SE cannot equivalence pointer based variable %0. 160 SE function variable cannot be an array. 243 SE a pointer variable cannot be an array. 86 SE function variable not allowed here. 51 SE function variable cannot be initialized. 449 SE array section not allowed here. 450 SE variable not allowed here. 451 SE array sections not conformable (%0 vs %1 dimensions). 452 SE cannot assign an array expression to a variable. 294 SW multiple blank SAVE statements. 245 SE symbol %0 appears in multiple SAVE statements. 454 SE dummy arguments cannot appear in a SAVE statement. 455 SE common block members cannot appear in a SAVE statement. 481 SE only variables, arrays, or common blocks may appear in a SAVE statement. variable usage checking: 106 UW function variable %0 was not set. 192 UE variable %0 is used as a label but was never assigned one. 193 UW variable %0 is assigned a label but never used as such. 194 UW variable %0 is used to hold both a label and a value. 195 UW dummy argument %0 is used as a label. 124 UF dummy argument %0 is unused. 126 UE local variable %0 is referenced but never set. 480 UW local pointer based variable %0 is referenced but never set. 127 UW local variable %0 is set but never referenced. 482 UW local pointer based variable %0 is set but never referenced. 128 UF local variable %0 declared but unused. 133 UE common block members referenced but not set: %0~~, %0~~ 134 UW common block members set but not referenced: %0~~, %0~~ 135 UF unused common block members: %0~~, %0~~ 500 UE local variable %0 always referenced before set. 501 UE local variable %0 conditionally referenced with no way of being set first. 502 UW local variable %0 conditionally set but always referenced. Not set on %1%% of possible paths (%2 of %3). 503 UW local variable %0 is referenced before set on %1%% of possible paths (%2 of %3). 505 UE local variable %0 always referenced (in a called subroutine) before set. 506 UE local variable %0 conditionally referenced (in a called subroutine) with no way of being set first. 507 UW local variable %0 conditionally set but always referenced (in a called subroutine). Not set on %1%% of possible paths (%2 of %3). 508 UW local variable %0 is referenced (in a called subroutine) before set on %1%% of possible paths (%2 of %3). 510 UE SAVEd variable %0 always referenced before set. 511 UE SAVEd variable %0 conditionally referenced with no way of being set first (even on a prior invocation of subprogram). 512 UF SAVEd variable %0 conditionally set but always referenced. Not set on %1%% of possible paths (%2 of %3). 513 UF SAVEd variable %0 is referenced before set on %1%% of possible paths (%2 of %3). 514 UF SAVEd variable %0 conditionally referenced, possibly set first on a prior invocation of subprogram. 515 UE SAVEd variable %0 always referenced (in a called subroutine) before set. 516 UE SAVEd variable %0 conditionally referenced (in a called subroutine) with no way of being set first (even on a prior invocation of subprogram). 517 UF SAVEd variable %0 conditionally set but always referenced (in a called subroutine). Not set on %1%% of possible paths (%2 of %3). 518 UF SAVEd variable %0 is referenced (in a called subroutine) before set on %1%% of possible paths (%2 of %3). 519 UF SAVEd variable %0 conditionally referenced (in a called subroutine), possibly set first on a prior invocation of subprogram. 520 UE local pointer based variable %0 always referenced before set. 521 UF local pointer based variable %0 conditionally referenced with no way of being set first (other than prior invocation of subprogram). 522 UF local pointer based variable %0 conditionally set but always referenced. Not set on %1%% of possible paths (%2 of %3). 523 UF local pointer based variable %0 is referenced before set on %1%% of possible paths (%2 of %3). 525 UE local pointer based variable %0 always referenced (in a called subroutine) before set. 526 UF local pointer based variable %0 conditionally referenced (in a called subroutine) with no way of being set first (other than prior invocation of subprogram). 527 UF local pointer based variable %0 conditionally set but always referenced (in a called subroutine). Not set on on %1%% of possible paths (%2 of %3). 528 UF local pointer based variable %0 is referenced (in a called subroutine) before set on %1%% of possible paths (%2 of %3). miscellaneous errors: 1 ZE missing include file. 477 ZE problem with CDD dictionary definition. 478 ZE problem with DBMS invoke statement. 479 SE unknown DBMS clause %0. 349 ZE label not found in include file; nothing included. 350 ZE no include file currently open; nothing included. 4 OO include nesting too deep. 35 SE unknown compiler directive. 60 SE cannot mix IMPLICIT NONE and IMPLICIT statements. 66 SE statement out of order, statement ignored. 74 SE must occur before %0 in line %1, statement ignored. 100 ZE missing text library. 118 ZE text library module not found. 156 SE invalid specifier. 166 OO expression too complex. 179 SE division by zero. 186 SE executable statements not allowed in block data module. control structures: 137 SE referenced but undefined labels: %0~~, %0~~ 138 SF unused labels: %0~~, %0~~ 104 SE entry not allowed in this subprogram. 196 SE inconsistent usage of label. 46 SW branch into block if via label %0. 47 SW branch into do loop via label %0. 48 SE unclosed block if. 49 SE unclosed do loop. 53 SW branch to label %0 from outside block if. 54 SW branch to label %0 from outside do loop. 101 SE label multiply defined. 110 SE no matching "IF" for this "ELSE IF". 111 SE no matching "IF" for this "ELSE". 112 SE no matching "IF" for this "END IF". 113 SE do loop end label inside nested DO LOOP or BLOCK IF. 114 SE no matching "DO" for this "END DO". 117 SE missing end statement. 153 SE $ELSE directive with no matching $IF directive 265 SE $ENDIF directive with no matching $IF directive 464 SE $ELSE directive inside $ELSE block 103 SW dead code local data type checking: 34 SE only character values allowed with // operator. 154 SE must be character data type. 161 SE %0{numeric/logical} data assigned to a character variable. 162 SE character data assigned to a %0{numeric/logical} variable. 177 SE non-character variable %0 referenced as character substring. 181 SE character expression where numeric data required. 84 SE variable used in assigned goto must be I*4 data type. 39 SE illegal data type. 80 SE %0{numeric/char} expression not allowed in logical if. 81 SE %0{char} expression not allowed in arithmetic if. 82 SE arithmetic expression expected. 105 SF string will be truncated (from %0 to %1 chars). 125 SM symbols were implicitly typed as %0: %1~~, %1~~ 136 SE type declaration for symbol %0 missing.{implicit under/none} 187 SE cannot assign label to non-integer variable. 76 SF mixed-mode arithmetic: (%0 o %1).{all operators other than '='} 276 SF data type conversion: (%0 = %1).{only = operator, others use #76} 261 SF %0 initializer converted to match %1 variable %2. 222 SF %1 variable %2 incompatible with %0 initializer. interface checking (argument passing): >>> obvious mismatches (subprogram name passed to alternate return, etc...) 250 IE %0 passed to dummy arg which is %1 %2.{obvious mismatches, ANSI 15.9.3} >>> mismatches with scalar entity passed to variable 55 IE %0 actual arg passed to a %1 dummy arg.{except for the following}{ANSI 15.9.3} I874 /VAX:217 *VAX-VAX:223 ; int constant passed to larger int I875 /VAX:226 *VAX-VAX:223 ; int expression passed to larger int I880 /VAX:226 *VAX:203 *VAX-VAX:223 ; int variable passed to larger int and not modified I876 /VAX:226 *VAX:289 *VAX-VAX:223 ; int variable passed to larger int and modified 217 IE %0 actual arg passed to %1 dummy arg.{int const -> larger int} 226 IE %0 actual arg passed to %1 dummy arg. 223 PW %p doesn't allow an %0 actual arg to be passed to an %1 dummy arg. 203 IW an %0 variable passed to an %1 dummy arg will incorporate surrounding memory into its value. 289 IE an %0 variable passed to an %1 dummy arg which modifies its value will overwrite surrounding memory. I878 /VAX:277 *VAX-VAX:410 ; int passed to smaller int that is not modified I879 /VAX:277 *VAX:227 *VAX-VAX:410 ; int passed to smaller int that is modified 277 IE %0 actual arg passed to %1 dummy arg. 410 PW %p doesn't allow an %0 actual arg to be passed to an %1 dummy arg. 227 IW an %0 actual arg passed to an %1 dummy arg which modifies its value will not change the upper bytes. I881 /VAX:457 *VAX-VAX:413 ; logical constant passed to larger log I882 /VAX:412 *VAX-VAX:413 ; logical expression passed to larger log I883 /VAX:412 *VAX-VAX:413 ; logical variable passed to larger log and not modified I884 /VAX:412 *VAX:414 *VAX-VAX:413 ; logical variable passed to larger log and modified 457 IE %0 actual arg passed to %1 dummy arg.{log const -> larger log} 412 IE %0 actual arg passed to %1 dummy arg. 413 PW %p doesn't allow a %0 actual arg to be passed to an %1 dummy arg. 414 IE an %0 variable passed to an %1 dummy arg which modifies its value will overwrite surrounding memory. I887 /VAX:278 *VAX-VAX:411 ; logical passed to smaller logical 278 IE %0 actual arg passed to %1 dummy arg. 411 PW %p doesn't allow a %0 actual arg to be passed to a %1 dummy arg. I877 /VAX:61 *VAX-VAX:224 ; char constant passed to non-char 61 IE %0{character} actual arg passed to %1{non-character} dummy arg. 224 PW %p doesn't allow a %0{character} actual arg to be passed to a %1{non-character} dummy arg. 249 IE %0{structure} passed to a %1{structure} dummy arg (same size but different format). 255 IE %0{structure} passed to a %1{structure} dummy arg (different size and different format). 256 IF %0{structure} passed to a %1{structure} dummy arg (same format but different names). 248 IE %0{structure} passed to a %1 dummy arg.{structure passed to non-structure} >>>future replacement of #248...246 IE %0{structure} passed to a %1 dummy arg of the same size. >>>future replacement of #248...247 IE %0{structure} passed to a %1 dummy arg of different size. 280 IW %0{character} constant passed to a %1{smaller character} dummy arg. 281 IF %0{character} actual arg passed to a %1{smaller character} dummy arg. 282 IE %0{character} actual arg passed to a %1{larger character} dummy arg. >>> mismatches with array passed to another array 252 IE %0 array passed to dummy arg which is a %1 array.{ANSI 15.9.3} 253 IE %0 array member passed to dummy arg which is a %1 array.{ANSI 15.9.3} 272 IE %0{structure} array passed to a %1{structure} array dummy arg (structures have same length but a different format). 273 IE %0{structure} array passed to a %1{structure} array dummy arg (structures have different lengths and different formats). 274 IF %0{structure} array passed to a %1{structure} array dummy arg (structures have same format but different names). 287 IE %0 array passed to %1 array of larger size (by %2 elements). 279 IF %0 array passed to %1 array of smaller size (by %2 elements). >>> mismatches with scalar entity passed to an array 251 IE %0 variable passed to dummy arg which is a %1 array.{except I886}{ANSI 15.9.3.3} 257 IE %0 expression passed to dummy arg which is a %1 array.{except I885}{ANSI 15.9.3.3} I885 /SUN:268 *SUN-SUN:228 ; character expression passed to byte or L*1 array I886 /SUN:230 *SUN-SUN:409 ; character variable passed to byte or L*1 array 268 IE %0 expression passed to dummy arg which is a %1 array. 228 PW %p doesn't allow a %0 expression to be passed to a %1 array. 230 IE %0 variable passed to dummy arg which is a %1 array. 409 PW %p doesn't allow a %0 variable to be passed to a %1 array. 271 IE %0{structure} passed to a %1 array dummy arg.{structure passed to non-structure array} >>>future replacement of #271...269 IE %0{structure} passed to a %1 array dummy arg of the same size. >>>future replacement of #271...270 IE %0{structure} passed to a %1 array dummy arg of different size. >>> mismatches with an array passed to a variable 254 IE %0 array passed to a %1 dummy arg.{ANSI 15.9.3.2} >>> usage conflicts 59 IE constant is changed by subprogram.{ANSI 15.9.3.2} 63 IW expression is changed by subprogram.{ANSI 15.9.3.2} >>> conflict in number of arguments 258 IE missing argument. 56 IE not enough arguments.{ANSI 15.9} 57 IE too many arguments.{ANSI 15.9} >>> intrinsic function checking 198 IE intrinsic function called with improper number of arguments. 292 IE %0 is not an allowable type for this intrinsic function. 293 IE %0 argument is not compatible with the %1 first argument. 295 IE this intrinsic function may not be passed to a subprogram. >>> other interface checking 85 IE %0 function locally typed as %1. 140 IW calling a function. 90 IE cannot call a common block. 91 IE cannot call a function with a type of CHAR, R*16, or C*16. 92 IE cannot call a program name. 93 IE cannot call a block data name. 94 IE this name is a common block name. 95 IE this name is defined as a subroutine. 96 IE this name is a program name. 97 IE this name is a block data name. 121 IF common block /%0/ member names differ (compared to initial use in routine %1). 122 IW common block /%0/ organization differs at member %2 (compared to initial use in routine %1). 185 IW common block /%0/ length mismatch (compared to initial use in routine %1). 129 IE missing functions: %0~~, %0~~ 130 IE missing subroutines: %0~~, %0~~ 131 IF unused functions: %0~~, %0~~ 132 IF unused subroutines: %0~~, %0~~ 189 IW no main program module present. 190 IW there are %0 program modules. 191 IE symbol %0 is multiply defined (%1 at %2 line %3 and %4 at %5 line %6). preprocessor: I804 /VAX/HP:308 -VAX-HP:201 ;debugging lines with D in column one 308 SE D-style debugging lines not supported. 201 PE D-style debugging lines not supported by %p.{ANSI 3.2} I872 /OS32:405 -OS32:406 ;debugging lines with X in column one 405 SE X-style debugging lines not supported. 406 PE X-style debugging lines not supported by %p.{ANSI 3.2} I855 /SUN/IRIS:318 -SUN-IRIS:320 ;continuation line with "&" in column 1 318 SE &-style continuation lines not supported. 320 PE %p does not support &-style continuation lines. I805 /VAX/AOS/SUN/CRAY/IRIS/HP/NCUBE:310 -VAX-AOS-SUN-CRAY-IRIS-HP-NCUBE:202 ;"!"-style inline comments 310 SE exclamation point inline comments are not supported. 202 PE exclamation point inline comments are not supported by %p.{ANSI 3.2} I870 /OS32:347 -OS32:348 ;";"-style inline comments 347 SE semicolon inline comments are not supported. 348 PE semicolon inline comments are not supported by %p.{ANSI 3.2} I800 *ANSI:322 +ANSI:219 ;sym 6-31 chars I801 *ANSI:322 *VAX*CRAY*NCUBE:301 +ANSI:219 +VAX+CRAY+NCUBE:302 ;sym 32 chars I929 *ANSI:322 *VAX*CRAY*NCUBE:301 *SUN:30 +ANSI:219 +VAX+CRAY+NCUBE:302 +SUN:31 ;sym 33-36 chars I930 *ANSI:322 *VAX*CRAY*NCUBE:301 *SUN:30 *OS32:300 +ANSI:219 +VAX+CRAY+NCUBE:302 +SUN:31 +OS32:286 ;sym 37-xx chars 322 SE symbol name longer than 6 characters. 301 SE symbol name longer than 31 characters. 30 SE symbol name longer than 32 characters. 300 SE symbol name longer than 36 characters. 219 PE symbol names longer than 6 characters not supported by %p.{ANSI 2.2} 302 PE symbol names longer than 31 characters not supported by %p. 31 PE symbol names longer than 32 characters not supported by %p. 286 PE symbol names longer than 36 characters not supported by %p. I807 /VAX/SUN/OS32/CRAY/IRIS/HP/NCUBE:45 -VAX-SUN-OS32-CRAY-IRIS-HP-NCUBE:204 ;"_" in mid symbol name I808 /VAX/SUN/IRIS/HP/NCUBE:45 -VAX-SUN-IRIS-HP-NCUBE:204 ;"$" in mid symbol name I809 /AOS:45 -AOS:204 ;"?" in symbol name 45 SE invalid character in symbol name. 204 PE non-alphanumeric characters in symbol names not supported by %p.{ANSI 2.2} I935 *NCUBE:497 /NCUBE:498 -NCUBE:499 ; $ or _ as first char in sym name 497 SF using an _ or $ to start a symbol name is not recommended 498 SE symbol names must begin with a letter 499 PE %p requires symbol names start with a letter I873 /OS32/NCUBE:407 -OS32-NCUBE:408 ; symbolic relational operators == <> < > <= >= 407 SE symbolic form of relational operator not supported. 408 PE %p does not support symbolic forms of relational operators. I933 /OS32:493 -OS32:494 ; symbolic logical operators & (and) ! (or) 493 SE symbolic form of logical operator not supported. 494 PE %p does not support symbolic forms of logical operators. constants: I815 /VAX:325 -VAX:326 ;"123 style octal constant 325 SE double quote style octal constants not supported. 326 PE double quote style octal constants not supported by %p.{ANSI 3.1.4} I862 /IRIS:345 -IRIS:346 ;$123 style hex constant 345 SE $123 style hex constants not supported 346 PE $123 style hex constants not supported by %p.{ANSI 4.2} I816 /VAX/SUN/IRIS/HP/NCUBE:327 -VAX-SUN-IRIS-HP-NCUBE:212 ;'123'O style octal constant 327 SE octal constants of the form '123'O are not supported. 212 PE octal constants of the form '123'O are not supported by %p.{ANSI 4.2} I817 /VAX/SUN/IRIS/HP/NCUBE:329 -VAX-SUN-IRIS-HP-NCUBE:213 ;'123'X style hex constant 329 SE hex constants of the form '123'X are not supported. 213 PE hex constants of the form '123'X are not supported by %p.{ANSI 4.2} I856 /SUN/IRIS:311 -SUN-IRIS:324 ;B'010101' style binary constant 311 SE B'01'-style binary constants not supported. 324 PE %p does not support B'01' style binary constants. I926 /IRIS:462 -IRIS:463 ;'010101'B style binary constant 462 SE '01'B style binary constants not supported. 463 PE %p does not support '01'B style binary constants. I927 /IRIS:485 -IRIS:486 ;'ff'Z style hex constant 485 SE 'ff'Z style hex constants not supported. 486 PE %p does not support 'ff'Z style hex constants. I928 /IRIS:487 -IRIS:488 ;O"77" style octal constant 487 SE O"77" style octal constants not supported. 488 PE %p does not support O"77" style octal constants. I857 /SUN/CRAY/IRIS/HP:328 -SUN-CRAY-IRIS-HP:330 ;O'157' style octal constant 328 SE O'17'-style octal constants not supported. 330 PE %p does not support O'17' style octal constants. I858 /SUN/OS32/CRAY/IRIS:332 -SUN-OS32-CRAY-IRIS:334 ;X'3EF' style hex constant 332 SE X'3F'-style hex constants not supported. 334 PE %p does not support X'3F' style hex constants. I889 *SUN:419 *OS32:419 +SUN:420 +OS32:420 ;X'1ef' constant contains +/- or spaces. 419 SE hexadecimal constant must be composed only of hexadecimal digits. 420 PE non-hexadecimal characters in hex constant not supported by %p. I859 /OS32:335 -OS32:336 ;Y'3EF' style hex constant 335 SE Y'3F'-style hex constants not supported. 336 PE %p does not support Y'3F' style hex constants. I860 /SUN/CRAY/IRIS/HP:338 -SUN-CRAY-IRIS-HP:340 ;Z'3EF' style hex constant 338 SE Z'3F'-style hex constants not supported. 340 PE %p does not support Z'3F' style hex constants. I861 /OS32/VAX:342 -OS32-VAX:344 ;Z1234 style hex constant 342 SE Z3FFF-style hex constants not supported. 344 PE %p does not support Z3FFF style hex constants. I818 /VAX/SUN/HP:331 -VAX-SUN-HP:214 ;Q-style real constant (quad precision) 331 SE Q-style real constants not supported. 214 PE Q-style real constants not supported by %p.{ANSI 4.5} I869 /VAX/SUN/HP:415 -VAX-SUN-HP:416 ; double precision real in complex constant 415 SE double precision real is not allowed as a part of a complex constant. 416 PE %p does not allow a double precision real as a part of a complex constant. I925 /VAX/SUN:483 -VAX-SUN:484 ; quad precision real in complex constant 483 SE quad precision real is not allowed as a part of a complex constant. 484 PE %p does not allow a quad precision real as a part of a complex constant. I888 /CRAY/HP:417 -CRAY-HP:418 ;1234567B style octal constant 417 SE octal constants of the form 377B are not supported. 418 PE octal constants of the form 377B are not supported by %p.{ANSI 4.2} I893 /CRAY:427 -CRAY:428 ; .T. and .F. abbreviations of .TRUE. and .FALSE. 427 SE .T. and .F. abbreviations not supported. 428 PE .T. and .F. abbreviations not supported by %p. I894 /CRAY:429 -CRAY:430 ; .N., .A., .O., and .X. operator abbreviations. 429 SE .N., .A., .O. and .X. operator abbreviations not supported. 430 PE .N., .A., .O. and .X. operator abbreviations not supported by %p. I905 /CRAY:182 -CRAY:183 ;'abc'h or 'abc'r or 'abc'l form of hollerith 182 SE this form of hollerith constant is not supported 183 PE %p does not support this form of hollerith constant data type conversions: I825 /VAX/SUN:163 -VAX-SUN:220 ;numeric assigned to a logical. 163 SE %0{numeric} data assigned to a %1{logical} variable. 220 PE %p does not allow a numeric expression to be assigned to a logical variable. I826 /VAX/SUN:164 -VAX-SUN:221 ;logical assigned to a numeric. 164 SE %0{logical} data assigned to a %1{numeric} variable. 221 PE %p does not allow a logical expression to be assigned to a numeric variable. I820 /VAX/SUN/IRIS:313 -VAX-SUN-IRIS:314 ;using integer val as logical 313 SE %0{integer} expression where a logical value required. 314 PE %p does not allow an integer expression to be used as a logical value. I827 /VAX/SUN/IRIS:184 -VAX-SUN-IRIS:218 ;using logical val as integer 184 SE %0{logical} value where numeric required. 218 PE %p does not allow logical data to be referenced as an integer value. I907 /VAX/OS32:460 -VAX-OS32:216 ;character constant in place of logical I829 /VAX/OS32/CRAY/SUN/IRIS:353 -VAX-OS32-CRAY-SUN-IRIS:165 ;character constant in place of numeric 460 SE character constant where logical data required. 353 SE character constant where numeric data required. 216 PE %p does not allow a character constant to be used as a logical value. 165 PE %p does not allow a character constant to be used as a numeric value. I854 /SUN:317 -SUN:225 ;using hollerith as a character string 317 SE hollerith where character type required. 225 PE %p does not allow hollerith to be used in place of character type. I910 /CRAY/SUN/VAX/IRIS:468 *CRAY:467 -CRAY-SUN-VAX:474 +CRAY:473 ;log .or. int/hol/char*X I911 /CRAY/SUN/VAX/IRIS:468 *CRAY:467 *SUN:465 *VAX*IRIS:465 -CRAY-SUN-VAX:474 +CRAY:473 +SUN:471 +VAX+IRIS:471 ;log .or. real I912 /CRAY/SUN/VAX/IRIS:468 -CRAY-SUN-VAX:474 ;int/h*8 .or. int/hol*8 I913 /CRAY/SUN/VAX/IRIS:468 *SUN:465 *VAX*IRIS:465 -CRAY-SUN-VAX:474 +SUN:471 +VAX+IRIS:471 ;real .or. int/real/hol*8/char*8 I914 /CRAY/SUN/VAX/IRIS:468 *CRAY:469 -CRAY-SUN-VAX:474 +CRAY:475 ;hol*9 .or. int/hol*x I915 /CRAY/SUN/VAX/IRIS:468 *SUN:466 -CRAY-SUN-VAX:474 +SUN:472 ;char*8 .or. int/hol*8/char*x I916 /CRAY/SUN/VAX/IRIS:468 *CRAY:470*SUN:466 -CRAY-SUN-VAX:474 +CRAY:476 +SUN:472 ;char*9 .or. int/hol*8/char*X I917 /CRAY/SUN/VAX/IRIS:468 *CRAY:469 *SUN:465 *VAX*IRIS:465 -CRAY-SUN-VAX:474 +CRAY:475 +SUN:472 +VAX+IRIS:471 ;real .or. hol*9 I918 /CRAY/SUN/VAX/IRIS:468 *CRAY:470 *SUN:465 *VAX*IRIS:465 -CRAY-SUN-VAX:474 +CRAY:476 +SUN:472 +VAX+IRIS:471 ;real .or. char*9 I919 /CRAY/SUN/VAX/IRIS:468 *CRAY:469 *SUN:466 -CRAY-SUN-VAX:474 +CRAY:475 +SUN:472 ;hol*9 .or. char*X 461 SE cannot use a %0 value with a logical operator. 465 SE cannot use a logical operator on a real value. 466 SE cannot use a logical operator on a character string. 467 SE cannot mix logical and non-logical with logical operator. 468 SE logical operator can only be used on logical values. 469 SE cannot use logical operator on a hollerith value > 8 chars 470 SE cannot use logical operator on a character value > 8 chars 471 PE %p does not allow a logical operator to be used on a real value. 472 PE %p does not allow a logical operator to be used on a character string. 473 PE %p does not allow logical and non-logical values to be mixed with a logical operator. 474 PE %p allows a logical operator to be used only on logical values. 475 PE %p does not allow a logical operator to be used on a hollerith value longer than 8 chars. 476 PE %p does not allow a logical operator to be used on a character value longer than 8 chars. statements: I906 /CRAY:458 -CRAY:459 ; BUFFER IN/OUT statements 458 SE BUFFER IN and BUFFER OUT statements not supported. 459 PE BUFFER IN and BUFFER OUT statements not supported by %p.{ANSI 3.3} I832 /VAX/SUN/IRIS/HP:354 -VAX-SUN-IRIS-HP:355 ; any type of structure statement 354 SE structures and unions not supported. 355 PE structures and unions not supported by %p.{ANSI 3.3} I833 /VAX/OS32/CRAY/SUN/IRIS/HP:356 -VAX-OS32-CRAY-SUN-IRIS-HP:357 ; encode/decode statements 356 SE ENCODE and DECODE statements not supported. 357 PE ENCODE and DECODE statements not supported by %p.{ANSI 3.3} I834 /VAX/OS32/SUN/IRIS/HP:358 -VAX-OS32-SUN-IRIS-HP:359 ; accept statement 358 SE ACCEPT statement not supported. 359 PE ACCEPT statement not supported by %p.{ANSI 3.3} I835 /VAX/IRIS:360 -VAX-IRIS:361 ; definefile statement 360 SE DEFILE FILE statement not supported. 361 PE DEFILE FILE statement not supported by %p.{ANSI 3.3} I836 /VAX/IRIS:362 -VAX-IRIS:363 ; delete statement 362 SE DELETE statement not supported. 363 PE DELETE statement not supported by %p.{ANSI 3.3} I837 /VAX/IRIS:364 -VAX-IRIS:365 ; find statement 364 SE FIND statement not supported. 365 PE FIND statement not supported by %p.{ANSI 3.3} I838 /VAX/IRIS:366 -VAX-IRIS:367 ; rewrite statement 366 SE REWRITE statement not supported. 367 PE REWRITE statement not supported by %p.{ANSI 3.3} I839 /VAX/OS32/SUN/IRIS/HP:368 -VAX-OS32-SUN-IRIS-HP:369 ; type statement 368 SE TYPE statement not supported. 369 PE TYPE statement not supported by %p.{ANSI 3.3} I840 /VAX:370 -VAX:371 ; unlock statement 370 SE UNLOCK statement not supported. 371 PE UNLOCK statement not supported by %p.{ANSI 3.3} I841 /VAX/OS32/SUN/CRAY/IRIS/HP/NCUBE:372 -VAX-OS32-SUN-CRAY-IRIS-HP-NCUBE:373 ; implicit none statement 372 SE IMPLICIT NONE statement not supported. 373 PE IMPLICIT NONE statement not supported by %p.{ANSI 3.3} I842 /VAX/SUN/IRIS/HP:374 -VAX-SUN-IRIS-HP:375 ; virtual statement 374 SE VIRTUAL statement not supported. 375 PE VIRTUAL statement not supported by %p.{ANSI 3.3} I843 /VAX/SUN/IRIS/HP:376 -VAX-SUN-IRIS-HP:377 ; volatile statement 376 SE VOLATILE statement not supported. 377 PE VOLATILE statement not supported by %p.{ANSI 3.3} I844 /VAX/SUN/IRIS:378 -VAX-SUN-IRIS:379 ; options statement 378 SE OPTIONS statement not supported. 379 PE OPTIONS statement not supported by %p.{ANSI 3.3} I845 /VAX:380 -VAX:381 ; dictionary statement 380 SE DICTIONARY statement not supported. 381 PE DICTIONARY statement not supported by %p.{ANSI 3.3} I846 /VAX/SUN/CRAY/IRIS/HP/NCUBE:382 -VAX-SUN-CRAY-IRIS-HP-NCUBE:383 ; include statement 382 SE INCLUDE statement not supported. 383 PE INCLUDE statement not supported by %p.{ANSI 3.3} I847 /VAX/SUN/IRIS/HP:384 -VAX-SUN-IRIS-HP:385 ; byte statement 384 SE BYTE statement not supported. 385 PE BYTE statement not supported by %p.{ANSI 3.3} I848 /VAX/SUN/CRAY/IRIS/HP:386 -VAX-SUN-CRAY-IRIS-HP:387 ; doublecomplex statement 386 SE DOUBLE COMPLEX statement not supported. 387 PE DOUBLE COMPLEX statement not supported by %p.{ANSI 3.3} I849 /VAX/SUN/OS32/CRAY/IRIS/HP/NCUBE:388 -VAX-SUN-OS32-CRAY-IRIS-HP-NCUBE:389 ; enddo statement 388 SE END DO statement not supported. 389 PE END DO statement not supported by %p.{ANSI 3.3} I850 /VAX/SUN/OS32/CRAY/IRIS/HP/NCUBE:390 -VAX-SUN-OS32-CRAY-IRIS-HP-NCUBE:391 ; namelist statement 390 SE NAMELIST statement not supported. 391 PE NAMELIST statement not supported by %p.{ANSI 3.3} I851 /SUN:392 -SUN:393 ; static/automatic data types 392 SE STATIC and AUTOMATIC data types not supported. 393 PE STATIC and AUTOMATIC data types not supported by %p.{ANSI 3.3} I852 /SUN/CRAY/IRIS/HP:394 -SUN-CRAY-IRIS-HP:395 ;pointer statement 394 SE pointers not supported. 395 PE pointers not supported by %p.{ANSI 3.3} I890 /CRAY:421 -CRAY:422 ; task common statement 421 SE task common blocks not supported. 422 PE task common blocks not supported by %p. I891 /CRAY:423 -CRAY:424 ; local common statement 423 SE local common blocks not supported. 424 PE local common blocks not supported by %p. I892 /CRAY:425 -CRAY:426 ; RECURSIVE qualifier to function statement. 425 SE RECURSIVE function qualifier not supported. 426 PE RECURSIVE function qualifier not supported by %p. I896 /CRAY:433 -CRAY:434 ; two-branch arithmetic IF 433 SE two-branch arithmetic IF not supported. 434 PE two-branch arithmetic IF not supported by %p. I897 /CRAY:435 -CRAY:436 ; indirect logical IF 435 SE indirect logical IF not supported. 436 PE indirect logical IF not supported by %p. I900 /CRAY:441 *CRAY:83 -CRAY:442 +CRAY:89; PUNCH statement 441 SE PUNCH statement not supported. 442 PE PUNCH statement not supported by %p. 83 SE PUNCH statement not supported by in CRAY CFT77 5.0. 89 PE PUNCH statement not supported by in CRAY CFT77 5.0. I901 /CRAY:443 -CRAY:444 ; DOUBLE statement 443 SE DOUBLE statement not supported. 444 PE DOUBLE statement not supported by %p. I924 /VAX:298 -VAX:299 ; DBMS statements 298 SE DBMS statements not supported. 299 PE DBMS statements not supported by %p. miscellaneous: I828 /CRAY:168 *CRAY:351 -CRAY:456 ;array referenced with too few arguments 168 SE array referenced with too few subscripts. 351 SW array referenced with too few subscripts. 456 PE %p does not allow an array to be referenced with too few subscripts. I903 /CRAY:447 -CRAY:448 ; array section 447 SE array sections not supported. 448 PE array sections not supported by %p. I902 *CRAY/CRAY:453 +CRAY-CRAY:446 ; pointer based character variable 453 SE character variables may not be pointer-based. {OK in 5.0} 446 PE pointer-based character variables not supported by %p. {OK in 5.0} I898 /CRAY:437 -CRAY:438 ; file name as unit number 437 SE use of a file name in place of unit number not supported. 438 PE %p does not support the use of a file name in place of a unit number. I899 /CRAY:439 -CRAY:440 ; WRITE statement w/o control list 439 SE WRITE statement without a control list not supported. 440 PE WRITE statement without a control list not supported by %p. I819 /OS32/IRIS:333 -OS32-IRIS:209 ;non-char data type length specifier surrounded by parens 333 SE non-character length specifiers may not be enclosed in parenthesis. 209 PE %p does not allow non-character length, specifiers to be enclosed in parenthesis. I821 /VAX/SUN/IRIS:337 -VAX-SUN-IRIS:215 ;linear array reference 337 SE reference to %0-dimensional array %1 with a single subscript. 215 PE linear element array reference not supported by %p.{ANSI 5.3} I822 /VAX/SUN:339 -VAX-SUN:141 ;sub name in CALL used to be a variable 339 SE this symbol was previously declared as a variable name. 141 PE %p requires subroutine names to be untyped.{ANSI 8.4} I823 /VAX/SUN:341 -VAX-SUN:142 ;sub name in CALL used to be a function name 341 SE this symbol was previously used as a function name. 142 PE %p does not allow functions to be called by the CALL statement.{ANSI 15.6.2.1} I824 /VAX/SUN:343 -VAX-SUN:143 ;func name used to be a sub name 343 SE this symbol was previously used as a subroutine name. 143 PE %p does not allow subroutines to be referenced as functions.{ANSI 15.2.1} I802 /VAX:304 -VAX:139 ;missing parens on function statement 304 SE parenthesis required on function definition. 139 PE %p requires parenthesis on function definitions.{ANSI 15.5.1} I803 /VAX/SUN/IRIS/HP:306 -VAX-SUN-IRIS-HP:200 ;the & form of alternate return specifier in call I931 /HP:489 -HP:490 ;the & form of alternate return specifier in subroutine statement 306 SE the & form of alternate return in call statements is not supported; use *. 200 PE the & form of alternate return in call statements is not supported by %p; use *.{ANSI 15.6.2.3} 489 SE the & form of alternate return in subroutine statements is not supported; use *. 490 PE the & form of alternate return in subroutine statements is not supported by %p; use *.{ANSI 15.6.2.3} I806 /VAX/SUN/IRIS/HP:312 -VAX-SUN-IRIS-HP:205 ;parameter statement without parens 312 SE parameter statement requires parentheses. 205 PE constant-typed parameter statement not supported by %p.{ANSI 8.6} I830 /SUN:303 -SUN:305 ;parameter statement with comma outside of parens 303 SE commas must be placed within parenthesis. 305 PE %p requires comma to be placed within parentheses.{ANSI 8.6} I810 /AOS/SUN/OS32/CRAY/IRIS/HP/NCUBE:316 -AOS-SUN-OS32-CRAY-IRIS-HP-NCUBE:208 ;double quoted string 316 SE double quote string delimiters not supported. 208 PE double quote string delimiters not supported by %p.{ANSI 4.8.1} I811 +ANSI:207 ;hollerith constant 207 PF hollerith constants are not recommended.{ANSI C1} I812 /VAX/IRIS/HP:319 -VAX-IRIS-HP:211 ; built in function %LOC() 319 SE built in function %%LOC is not supported. 211 PE built in function %%LOC is not supported by %p. I813 /VAX/SUN/IRIS/HP:321 -VAX-SUN-IRIS-HP:206 ;actual arg %VAL() 321 SE %%VAL is not supported. 206 PE %%VAL is not supported by %p. I831 /VAX/IRIS/HP:307 -VAX-IRIS-HP:309 ;actual arg %REF(), %DESCR() 307 SE %%REF, and %%DESCR are not supported. 309 PE %%REF, and %%DESCR are not supported by %p. I871 /OS32:352 -OS32:404 ;dummy args surrounded by slashes 352 SE slashes on dummy arguments are not supported. 404 PE slashes on dummy arguments are not supported by %p.{ANSI 3.2} I814 /VAX/OS32/SUN/IRIS/HP/NCUBE:323 -VAX-OS32-SUN-IRIS-HP-NCUBE:210 ;data type statement initialization list 323 SE type statement initialization lists not supported. 210 PE type statement initialization lists not supported by %p.{ANSI 8.4.1} I853 /SUN/IRIS:155 -SUN-IRIS:315 ;undefined data type in implicit statement 155 SE undefined data type not supported. 315 PE undefined data type not supported by %p. I863 /VAX/SUN/OS32/CRAY/IRIS/HP/NCUBE:396 -VAX-SUN-OS32-CRAY-IRIS-HP-NCUBE:397 ;NONCHAR*2 BAR*2,BAR()*2 I864 /VAX/SUN/OS32/IRIS/HP/NCUBE:396 -VAX-SUN-OS32-IRIS-HP-NCUBE:397 ;NONCHAR*2 FUNCTION BAR() I865 /VAX/SUN/OS32/IRIS:396 *VAX*SUN*NCUBE:400 -VAX-SUN-OS32-IRIS:397 +VAX+SUN+NCUBE:401 ;NONCHAR BAR*2() I866 /VAX/SUN/OS32/IRIS/HP:396 *SUN*NCUBE:402 -VAX-SUN-OS32-IRIS-HP:397 +SUN+NCUBE:403 ;NONCHAR FUNCTION BAR*2() I867 /OS32:400 -OS32:401 ;CHARACTER BAR*2() I868 /VAX/OS32/IRIS:402 -VAX-OS32-IRIS:403 ;CHARACTER FUNCTION BAR*2() manual says: I864 /VAX/SUN/OS32/IRIS:396 *VAX:398 -VAX-SUN-OS32-IRIS:397 +VAX:399 ;NONCHAR*2 FUNCTION BAR() 285 SE length specifier not allowed on this data type. 288 SE a length specifier can only be used if a data type is given. 396 SE length specifier allowed only on character data type. 397 PE %p does not support length specifiers on non-character data types. 398 SE length specifier on non-character function statement must appear after function name. 399 PE %p requires that the length specifier on a non-character function statement appear after the function name. 400 SE length specifier must appear after the array declaration. 401 PE %p requires length specifier to appear after the array declaration. 402 SE length specifier must appear before FUNCTION. 403 PE %p requires length specifier to appear before FUNCTION. I895 /CRAY/HP:431 -CRAY-HP:432 ; arguments on PROGRAM statement 431 SE arguments not allowed on PROGRAM statement. 432 PE %p does not allow arguments on a PROGRAM statement. I920 *ANSI:102 +ANSI:119 ; array or subprogram as a statement function actual arg 102 SE only expressions or variables are allowed as statement function arguments. 119 PE %p only allows expressions or variables as statement function arguments.{ANSI 15.4.2} I921 /VAX:78 -VAX:79 ; statement function dummy arg is modified 78 SE statement function dummy arguments may not be modified. 79 PE %p does not allow a statement function dummy argument to be modified.{ANSI 15.4.3} I922 /VAX:78 -VAX:79 ; statement function dummy arg is an array 290 SE an array may not be a statement function dummy argument. 291 PE %p does not allow an array as a statement function dummy argument.{ANSI 15.4.1} I923 /SUN:296 -SUN:297 ; null string 296 SE character constants must contain at least one character. 297 PE %p does not allow null character constants. I932 /NCUBE:491 -NCUBE:492 ; type statement CHARACTER ([LEN=]length) v, v... 491 SE missing asterisk or symbol name. 492 PE non-asterisk form of character length specification not allowed by %p. I934 /NCUBE:495 -NCUBE:496 ; routine type and name on end statement 495 SE extra characters on END statement. 496 PE %p does not allow routine types or names on the END statement. I936 *ANSI:529 +ANSI:530 ; more than 19 continuation lines 529 SE cannot exceed 19 continuation lines. 530 PE %p does not allow more than 19 continuation lines. unused: 904,508,509 reserved: 246,247,269,270 Appendix F Performance F.1 Disk Space F.1.1 Program Size The FORTRAN-lint production files, as delivered, occupy approximately 1 MB of disk space excluding the Xlint related files, which occupy another 2 MB. The amount of disk space required during processing will depend on the files processed. F.1.2 Temporary Files FORTRAN-lint generates temporary files during its processing of the source files. These files are automatically deleted upon program termination, even if aborted. On the UNIX based systems, the tempnam() system library call is used to obtain the names for these temporary files, which lends a bit of configurability as to where these files are placed. The man page for tempnam() gives the details, but generally the directory /usr/tmp or /tmp is used unless overridden by the environment variable TMPDIR. Under VMS, temporary file names begin with SYS$SCRATCH to allow user control over where the files are placed. The most temporary space is needed when generating cross reference tables or databases, especially when using line resolution of symbol references. 'Including' unused common members or unreferenced parameters in the cross reference increases this demand even more. Expect about 1-2 MB tempfile size per 10,000 lines of source code.