NAME
ftnchek - Fortran 77 program checker
SYNOPSIS
ftnchek [ -arguments[=list] ]
[ -array[=list] ]
[ -[no]brief ]
[ -calltree[=list] ] [
-[no]check ]
[ -columns[=num] ] [
-common[=list] ]
[
-[no]crossref[=list] ] [
-[no]declare ]
[ -[no]division
] [ -errors[=num] ] [
-[no]extern ]
[
-[no]f77[=list] ] [
-[no]f90[=list] ]
[
-[no]f95[=list] ] [
-[no]help ]
[
-[no]identifier-chars[=list] ] [
-include=str ]
[ -intrinsic[=list] ]
[ -[no]library ] [
-[no]list ]
[ -makedcls[=list] ] [
-mkhtml[=list] ]
[ -[no]novice ]
[ -output=str ]
[ -pointersize[=num] ]
[ -[no]portability[=list] ]
[
-[no]pretty[=list] ] [
-project[=list] ]
[ -[no]pure ] [
-[no]quiet ] [
-[no]reference ]
[
-[no]resources ] [
-[no]sixchar ] [
-[no]sort ]
[ -source[=list] ] [
-style[=list] ] [ -[no]symtab
]
[
-[no]truncation[=list] ] [
-usage[=list] ]
[ -[no]vcg ] [
-[no]version ] [
-[no]volatile ]
[ -wordsize[=num] ] [
-wrap[=num] ] [ files ... ]
DESCRIPTION
ftnchek (short for Fortran checker) is designed to detect
certain errors in a Fortran program that a compiler usually does
not. ftnchek is not primarily intended to detect syntax
errors. Its purpose is to assist the user in finding semantic
errors. Semantic errors are legal in the Fortran language but are
wasteful or may cause incorrect operation. For example, variables
which are never used may indicate some omission in the program;
uninitialized variables contain garbage which may cause incorrect
results to be calculated; and variables which are not declared may
not have the intended type. ftnchek is intended to assist
users in the debugging of their Fortran program. It is not intended
to catch all syntax errors. This is the function of the compiler.
Prior to using ftnchek, the user should verify that the
program compiles correctly.
This document first summarizes how to invoke ftnchek.
That section should be read before beginning to use ftnchek.
Later sections describe ftnchek's options in more detail,
give an example of its use, and explain how to interpret the
output. The final sections mention the limitations and known bugs
in ftnchek.
INVOKING FTNCHEK
ftnchek is invoked through a
command of the form:
$ ftnchek [-option -option ...] filename [filename
...]
The brackets indicate something which is optional. The brackets
themselves are not actually typed. Here options are command-line
switches or settings, which control the operation of the program
and the amount of information that will be printed out. If no
option is specified, the default action is to print error messages,
warnings, and informational messages, but not the program listing
or symbol tables.
Each option begins with the '-' character. (On VAX/VMS or MS-DOS
systems you may use either '/' or '-'.) For the sake of conformity
with an increasingly common convention, options can also begin with
'--'. The options are described at greater length in the next
section.
ftnchek options fall into two categories: switches, which
are either true or false, and settings, which have a numeric or
string value. The name of a switch is prefixed by 'no' or 'no-' to
turn it off: e.g. -nopure would turn off the warnings about
impure functions. The 'no' prefix can also be used with numeric
settings, having the effect of turning off the corresponding
warnings. Settings that control lists of warnings have a special
syntax discussed below. Only the first 3 characters of an option
name (not counting the '-') need be provided. A colon may be used
in place of an equals sign for numeric or string setting
assignments; however, we show only the equals sign form below.
The switches and settings which ftnchek currently
recognizes are listed below. For each option, the default is the
value used if the option is not explicitly specified, while the
turn-on is the value used if the option is given without assigning
it a value.
- -arguments=list
- Control warnings about subprogram type and argument mismatches.
Default = turn-on = all.
- -array=list
- Control warnings in checking array arguments of subprograms.
Default = turn-on = all.
- -brief
- Use shorter format for some error messages. Default = no.
- -calltree=list
- Produce subprogram call hierarchy in one of 3 formats: text
call-tree, who-calls-who and VCG. Default = none, turn-on =
tree,prune,sort.
If the -mkhtml option is invoked and tree is the
applied calltree option, a file named CallTree.html, will be
produced depicting the tree in HTML format.
- -check
- Perform checking. Default = yes.
- -columns=num
- Set maximum line length to num columns. (Beyond this is
ignored.) Turn-on = max = 132. Default = 72.
- -common=list
- Set degree of strictness in checking COMMON blocks. Default =
turn-on = all.
- -crossref=list
- Print cross-reference list of subprogram calls, label usage,
and/or COMMON block use. Default = none.
- -declare
- Print a list of all identifiers whose datatype is not
explicitly declared. Default = no.
- -division
- Warn wherever division is done (except division by a constant).
Default = no.
- -errors=num
- Set the maximum number of error messages per cascade. Default =
turn-on = 3.
- -extern
- Warn if external subprograms which are invoked are never
defined. Default = yes.
- -f77=list
- Control specific warnings about supported extensions to the
Fortran 77 Standard. Default = none, turn-on = all.
- -f90=list
- Control specific warnings about supported extensions to the
Fortran 77 Standard that were not adopted as part of the Fortran 90
Standard. Default = none, turn-on = all.
- -f95=list
- Control specific warnings about standard Fortran 77 features
that were deleted from the Fortran 95 Standard. Default = none,
turn-on = all.
- -help
- Print command summary. Default = no.
- -identifier-chars=list
- Define non-alphanumeric characters that may be used in
identifiers. Default = turn-on = dollar sign and underscore.
- -include=path
- Define a directory to search for INCLUDE files before searching
in the system-wide directory. Cumulative. Default = turn-on = none.
- -intrinsic=list
- Control treatment of nonstandard intrinsic functions. Default =
all except vms for Unix version, all except unix for
VMS version, all except unix and vms for other
versions. Turn-on = all.
- -library
- Begin library mode: do not warn about subprograms in file that
are defined but never used. Default = no.
- -list
- Print source listing of program. Default = no.
- -makedcls=list
- Prepare a file of declarations. The list specifies
options for the format of this file. Default = none, turn-on =
declarations.
- -mkhtml=list
- Create individual HTML document files from ftnchek analysis and
code comments. Usually you will also want to specify
-call=tree to create the root HTML file CallTree.html.
Default = none, turn-on = documents.
- -novice
- Give output suitable for novice users. Default = yes.
- -output=filename
- Send output to the given file. Default and turn-on sends output
to the screen. (Default filename extension is .lis).
- -pointersize=num
- Set the size of ``Cray pointer'' variables to num bytes.
Min = 1, max = 16. Default = turn-on = 4
- -portability=list
- Warn about non-portable usages. Default = none, turn-on = all.
- -pretty=list
- Give warnings for possibly misleading appearance of source
code. Default = turn-on = all.
- -project=list
- Create project file (see explanation below). Default = no.
- -pure
- Assume functions are pure, i.e. have no side effects. Default =
yes.
- -quiet
- Produce less verbose output. Default = no.
- -reference
- Print table of subprograms referenced by each subprogram.
Default = no.
- -resources
- Print amount of resources used in analyzing the program.
Default = no.
- -sixchar
- List any variable names which clash at 6 characters length.
Default = no.
- -sort
- Print list of subprograms sorted in prerequisite order. Default
= no.
- -source=list
- Select source formatting options: fixed or free form, DEC
Fortran tab-formatted lines, VMS-style INCLUDE statement,
UNIX-style backslash escape sequences, and implicit typing of
parameters. Default = none, turn-on = all.
- -style=list
- Produce extra-picky warnings about obsolescent or old-fashioned
programming constructions. Default = none, turn-on = all.
- -symtab
- Print symbol table and label table for each subprogram. Default
= no.
- -truncation=list
- Check for possible loss of accuracy by truncation. Default =
turn-on = all.
- -usage=list
- Control warnings about unused or uninitialized variables,
common blocks, etc. Default = turn-on = all.
- -vcg
- Produce VCG format of call graph.
- -version
- Print version number. Default = no.
- -volatile
- Assume COMMON blocks lose definition between activations.
Default = no. (Obsolete. Use -common=volatile instead.)
- -wordsize=num
- Set the default word size for numeric quantities to num
bytes. Default = turn-on = 4 bytes.
- -wrap=num
- Set output column at which to wrap long error messages and
warnings to the next line. If set to 0, turn off wrapping. Default
= turn-on = 79.
When more than one option is used, they should be separated by a
blank space, except on systems such as VMS where options begin with
slash ( / ). No blank spaces may be placed around the equals sign (
= ) in a setting. ftnchek "?" will produce a command summary
listing all options and settings.
For settings that take a list of keywords, namely
-arguments, -array, -calltree, -common,
-crossref, -f77, -f90, -f95,
-intrinsic, -makedcls, -mkhtml,
-portability, -pretty, -project,
-source, -style, -truncation, and
-usage, the list consists of keywords separated by commas or
colons. If the list of keywords is omitted, the effect is to set
the option to its turn-on value (same as ``all'' in most cases).
Also, if the list is omitted, the setting name can be prefixed with
no or no- to turn off all the options it controls.
For example, -f77 turns on all warnings about nonstandard
constructions, while -nof77 turns them all off. Three
special keywords are:
- help
- Print out all the option keywords controlled by the setting,
with a brief explanation of their meanings. This keyword cannot be
given in a list with other keywords.
- all
- Set all options. This turns on all options controlled by the
setting.
- none
- Clear all options. This turns off all options controlled by the
setting.
These three special keywords must be given in full. For all
other keywords, only as many letters of the keyword as are
necessary to identify it unambiguously need be given, or a wildcard
pattern may be used. Including a keyword in the list turns the
corresponding option on. For example, -f77=intrinsic would
turn on only the warnings about use of nonstandard intrinsic
functions. Prefixing a keyword by no- turns its option off.
For example, -pretty=no-long-line turns off warnings about
lines exceeding 72 columns in length while leaving all other
warnings about misleading appearance in effect. If a setting has
default none, you can turn on all options except one or two
by using all first. For example, -f77=all,no-include
enables warnings about all nonstandard extensions except INCLUDE
statements. If a setting has default all, you can turn off
all warnings except one or two by using none first. For
example, -truncation=none,demotion would turn off all
precision related warnings except about demotions. Wildcard
patterns contain an asterisk to stand for any string of characters.
If a wildcard pattern is used, all the warnings that match it are
affected. If no- is prefixed to the pattern, all the
matching warnings are turned off, otherwise they are all turned on.
The minimum unambiguous length rule does not apply to wildcard
matching. For example, use -usage=no-*var* to turn off all
warnings relating to variable usage (both local and common). (Unix
users may need to quote any options containing wildcards in order
to prevent the shell from attempting to expand them.) Wildcards are
recognized only in lists of warning keywords, not in the top-level
options themselves.
When ftnchek starts up, it looks for environment
variables and also for a preferences file. Any options defined in
the environment or in the preferences file are used as defaults in
place of the built-in defaults. They are over-ridden by any command
line options. See the section on changing the defaults for details
about the environment options and the preferences file.
When giving a name of an input file, the extension is optional.
If no extension is given, ftnchek will first look for a
project file with extension .prj, and will use that if it
exists. If not, then ftnchek will look for a Fortran source
file with the extension .for for VMS systems, .f for
UNIX systems. More than one file name can be given to
ftnchek, and it will process the modules in all files as if
they were in a single file.
Wildcards are allowed in the specification of filenames on the
command line for the VMS and MS-DOS versions, as also of course
under UNIX and any other system that performs wildcard expansion in
the command processor.
If no filename is given, ftnchek will read input from the
standard input.
OPTIONS
This section provides a more detailed discussion of
ftnchek command-line options. Options and filenames may be
interspersed on a command line. Most options are positional: each
option remains in effect from the point it is encountered until it
is overridden by a later change. Thus for example, the listing may
be suppressed for some files and not for others. Exceptions are:
the -intrinsic, -pointersize, and -wordsize
settings, which cannot be changed once processing of input files
has started; the -arguments, -array,
-calltree, -common, -crossref, -extern,
-reference, -resources, -sort, -vcg,
and -volatile options, where the action depends only on the
value of the option after the processing of input files is
finished; and the -include setting, which is cumulative.
The option names in the following list are in alphabetical
order.
- -arguments=list
-
- Controls warnings about mismatches between actual and dummy
subprogram arguments, and also about mismatches between expected
and actual subprogram type. (An actual argument is an argument
passed to the subprogram by the caller; a dummy argument is an
argument received by the subprogram.) By default, all warnings are
turned on.
The list consists of keywords separated by commas or
colons. Since all these warnings are on by default, include a
keyword prefixed by no- to turn off a particular warning.
There are three special keywords: all to turn on all the
warnings about arguments, none to turn them all off, and
help to print the list of all the keywords with a brief
explanation of each. If list is omitted, -arguments
is equivalent to -arguments=all, and -noarguments is
equivalent to -arguments=none. The warning keywords with
their meanings are as follows:
- arrayness:
- warn about inconsistent use of arguments that are arrays. These
warnings can be further controlled by the -array option.
- type:
- warn about dummy arguments of a different data type from the
actual arguments.
- function-type:
- warn if the invocation assumes the function's return value is a
different type than it actually is. Also warns if a function is
called as a subroutine, or vice-versa.
- number:
- warn about invoking a subprogram with a different number of
arguments than the subprogram expects.
For compatibility with previous versions of ftnchek, a
numeric form of this setting is also accepted: the list is
replaced by a number from 0 to 3. A value of 0 turns all the
warnings off, 1 turns on only number, 2 turns on all except
number, and 3 turns all the warnings on.
This setting does not apply to checking invocations of intrinsic
functions or statement functions, which can only be turned off by
the -nocheck option.
See also: -array, -library, -usage.
- -array=list
-
- Controls the degree of strictness in checking agreement between
actual and dummy subprogram arguments that are arrays. The warnings
controlled by this setting are for constructions that might
legitimately be used by a knowledgeable programmer, but that often
indicate programming errors. By default, all warnings are turned
on.
The list consists of keywords separated by commas or
colons. Since all these warnings are on by default, include a
keyword prefixed by no- to turn off a particular warning.
There are three special keywords: all to turn on all the
warnings about array arguments, none to turn them all off,
and help to print the list of all the keywords with a brief
explanation of each. If list is omitted, -array is
equivalent to -array=all, and -noarray is equivalent
to -array=none. The warning keywords with their meanings are
as follows:
- dimensions:
- warn if the arguments differ in their number of dimensions, or
if the actual argument is an array element while the dummy argument
is a whole array.
- size:
- warn if both arguments are arrays, but they differ in number of
elements.
For compatibility with previous versions of ftnchek, a
numeric form of this setting is also accepted: the list is
replaced by a number from 0 to 3. A value of 0 turns all the
warnings off, 1 turns on only dimensions, 2 turns on only
size, and 3 turns all the warnings on.
Note: A warning is always given regardless of this setting if
the actual argument is an array while the dummy argument is a
scalar variable, or if the actual argument is a scalar variable or
expression while the dummy argument is an array. These cases are
seldom intentional. (To turn off even these warnings, use
-arguments=no-arrayness.) No warning is ever given if the
actual argument is an array element while the dummy argument is a
scalar variable. Variable-dimensioned arrays and arrays dimensioned
with 1 or asterisk match any number of array elements. There is no
check of whether multi-dimensional arrays agree in the size of each
dimension separately.
See also: -arguments, -library,
-usage.
- -brief
-
- Selects a shorter format for some warning messages. At present,
the only warnings controlled by this flag are those that are
printed at the end of processing each subprogram. These include
warnings about variables that are set but not used or used before
set, variable names that do not conform to the Fortran 77 standard,
etc. (These warnings may be suppressed entirely depending on other
flags, such as the -usage or -f77 flags.) In the
default format each variable is listed on a separate line, along
with the line number where the variable is declared, set or used,
according to the nature of the warning. The briefer format simply
lists all variables to which the warning applies, with up to 4
variables per line.
See also: -quiet.
- -calltree=list
-
- Causes ftnchek to print out the call structure of the
complete program.
The list consists of keywords separated by commas or
colons. There are two special keywords: none to turn off all
the options, and help to print the list of all the keywords
with a brief explanation of each. (The keyword all turns on
all the options, but should not normally be used since only one
format should be specified.) If list is omitted,
-calltree is equivalent to -calltree=tree, and
-nocalltree is equivalent to -calltree=none. By
default no call graph is printed.
If the -mkhtml option is invoked and tree is the applied
calltree option, a file named CallTree.html, will also be produced
depicting the tree in HTML format. This file is useful as a
starting point for browsing the HTML files describing each
component of the program.
The keywords which control which format is used are as follows:
- tree:
- produce the call graph in tree format.
- reference:
- produce the call graph in who-calls-who format (same as
-reference switch).
- vcg:
- produce the call graph in VCG format (same as -vcg
switch).
Only one of the formats tree, reference, or
vcg may be specified.
The following keywords control options affecting the output:
- prune:
- prune repeated subtrees (applicable only with tree).
This the default.
- sort:
- sort children of each routine into alphabetical order. This is
the default.
See the discussion of the -reference and -vcg
flags for details about these formats.
For tree format, The call graph is printed out starting
from the main program, which is listed on the first line at the
left margin. Then on the following lines, each routine called by
the main program is listed, indented a few spaces, followed by the
subtree starting at that routine.
In the default mode, if a routine is called by more than one
other routine, its call subtree is printed only the first time it
is encountered Later calls give only the routine name and the
notice ``(see above)''. To have the subtree printed for each
occurrence of the routine, use option no-prune.
Note that the call tree will be incomplete if any of the input
files are project files containing more than one module that were
created in -library mode. See the discussion of project
files below.
Technical points: Each list of routines called by a given
routine is printed in alphabetical order unless the no-sort
option is given. If multiple main programs are found, the call tree
of each is printed separately. If no main program is found, a
report to that effect is printed out, and the call trees of any
top-level non-library routines are printed. This flag only controls
the printing of the call tree: ftnchek constructs the call
tree in any case because it is used to determine which library
modules will be cross-checked. See the discussion of the
-library flag.
For compatibility with previous versions of ftnchek, a
numeric form of this setting is also accepted: the list is
replaced by a number from 0 to 15. This number is formed from 1 for
tree format, 2 for reference format, or 3 for
vcg format, plus 4 for no-prune, and 8 for
no-sort.
See also: -crossref, -library, -reference,
-sort, -symtab, -vcg.
- -check
-
- This switch is provided so that errors and warning messages can
be turned off when ftnchek is used for purposes other than
finding bugs, such as making declarations or printing the call
tree. It is positional, so after turning all checks off, selected
checks can be turned back on. The effect of -nocheck is to
put all switches, numeric settings, and settings controlling lists
of warnings to their turn-off values, as if they had all been
specified with the -no prefix. Switches and settings that specify
options and modes of operation, rather than controlling warnings,
are unaffected. These are -columns, -crossref,
-include, -intrinsic, -library, -list,
-makedcls, -novice, -output,
-pointersize, -project, -quiet,
-reference, -resources, -sort, -source,
-symtab, -vcg, -version, -wordsize, and
-wrap. Default = yes.
Parse errors (syntax errors due to unrecognized or malformed
statements) are not suppressed by this switch, since the results
may be incorrect if ftnchek has not parsed the program
correctly.
There are some miscellaneous errors and warning messages that
are not controlled by any other switch, and so can be turned off
only by this switch. Note that using -check following
-nocheck only has the effect of turning these special
warnings back on, and does not restore all the checks it turned
off. These warnings are:
- o
- Module contains no executable statements.
- o
- In free source form, missing space where space is required
(e.g. between a keyword and an identifier) or space present where
none is allowed (e.g. within an identifier).
- o
- Zero or negative length specification in a data type
declaration of the form type*len.
- o
- Invalid operand(s) in an expression.
- o
- Array assigned to scalar.
- o
- Type mismatch between DO index and bounds.
- o
- Undefined common block declared in SAVE statement.
- o
- Intrinsic function explicitly declared with an incompatible
type.
- o
- Unknown intrinsic function explicitly declared in an INTRINSIC
statement.
- o
- Intrinsic function passed as a subprogram argument is not
declared in an INTRINSIC statement.
- o
- Intrinsic function or statement function invoked incorrectly.
- o
- Function does not set return value prior to RETURN statement.
- o
- Parameter constant value not evaluated (this is
ftnchek's fault, and it is just informing you of the fact).
- o
- Entry point of a subprogram is later used as a different
subprogram's name.
- o
- Unknown keyword used in an I/O statement.
- o
- Illegal label reference (e.g. GOTO refers to a non-executable
statement; I/O statement refers to a non-format statement).
See also: -errors.
- -columns=num
-
- Set maximum statement length to num columns. (Beyond
this is ignored.) This setting is provided to allow checking of
programs which may violate the Fortran standard limit of 72 columns
for the length of a statement. According to the standard, all
characters past column 72 are ignored. If this setting is used when
the -f77=long-line option is in effect, a warning will be
given for any lines in which characters past column 72 are
processed. Turn-on = max = 132. Default = 72.
This setting does not suppress warnings about the presence of
characters beyond column 72. To process code with meaningful
program text beyond column 72, use this setting and be sure the
-f77 long-line option is off. To process code with
sequence numbers in columns 73 to 80, leave the the columns setting
at the default value and use the -pretty=no-long-line flag.
See also: -f77, -pretty.
- -common=list
-
- This setting controls the strictness of checking of COMMON
blocks. By default, all warnings except volatile are turned
on.
The list consists of keywords separated by commas or
colons. Since most of these warnings are on by default, include a
keyword prefixed by no- to turn off a particular warning.
There are three special keywords: all to turn on all the
warnings, none to turn them all off, and help to
print the list of all the keywords with a brief explanation of
each. If list is omitted, -common is equivalent to
-common=dimensions,exact,length,type, and -nocommon
is equivalent to -common=none. The warning keywords with
their meanings are as follows:
- dimensions:
- corresponding arrays in each declaration of a block must agree
in size and number of dimensions. This option only has an effect
when used together with exact.
- exact:
- the comparison of two blocks is done variable-by-variable
rather than simply requiring agreement between corresponding
storage locations. Use this if all declarations of a given COMMON
block are supposed to be identical, which is a good programming
practice.
- length:
- warn if different declarations of the same block are not equal
in total length. The Fortran 77 Standard requires each named common
block, but not blank common, to be the same length in all modules
of the program.
- type:
- in each declaration of a given COMMON block, corresponding
memory locations (words or bytes) must agree in data type. If used
together with exact, this will require that corresponding
variables agree in data type.
- volatile:
- Assume that COMMON blocks are volatile.
Many Fortran programmers assume that variables, whether local or
in COMMON, are static, i.e. that once assigned a value, they retain
that value permanently until assigned a different value by the
program. However, in fact the Fortran 77 Standard does not require
this to be the case. Local variables may become undefined between
activations of a module in which they are declared. Similarly,
COMMON blocks may become undefined if no module in which they are
declared is active. (The technical term for entities with this
behavior is ``automatic'', but ftnchek uses the word
``volatile'' since it is clearer to the nonspecialist.) Only COMMON
blocks declared in a SAVE statement, or declared in the main
program or in a block data subprogram remain defined as long as the
program is running. Variables and COMMON blocks that can become
undefined at some point are called volatile.
If the -common=volatile flag is turned on, ftnchek
will warn you if it finds a volatile COMMON block. If, at the same
time, the -usage=com-block-volatile option is turned on
(which is the default), ftnchek will try to check whether
such a block can lose its defined status between activations of the
modules where it is declared. ftnchek does not do a very
good job of this: the rule used is to see whether the block is
declared in two separated subtrees of the call tree. For instance,
this would be the case if two modules, both called from the main
program, shared a volatile COMMON block. A block can also become
undefined between two successive calls of the same subprogram, but
ftnchek is not smart enough to tell whether a subprogram can
be called more than once, so this case is not checked for.
The -common=volatile flag does not affect the way
ftnchek checks the usage of local variables.
For compatibility with previous versions of ftnchek, a
numeric form of this setting is also accepted: the list is
replaced by a number from 0 to 3. A value of 0 turns all the
warnings off, 1 or greater turns on type, 2 or greater turns
on length, and 3 turns on dimensions and exact
also. The numeric form cannot turn on the volatile option.
See also: -library, -usage.
- -crossref=list
-
- Prints cross-reference tables. Default = none.
The list consists of keywords separated by commas or
colons. The keywords with their meanings are as follows:
- calls:
- table lists each subprogram followed by a list of routines that
call it. This listing omits library modules that are not in the
call tree of the main program. The list is alphabetized.
- common:
- table lists each COMMON block followed by a list of the
routines that access it. These listed routines are those in which
some variables in the COMMON block are accessed, not simply those
routines that declare the block. (To find out what routines declare
a COMMON block but do not use it, see the -usage flag.)
- labels:
- table lists each label followed by a list of all references to
it. A label reference is denoted by the line number and statement
type of the referring statement. The label list is in sequential
order. The references are listed in the order they are encountered
in the program.
See also: -calltree, -reference, -sort,
-symtab, -vcg.
- -declare
-
- If this flag is set, all identifiers whose datatype is not
declared in each module will be listed. This flag is useful for
helping to find misspelled variable names, etc. The same listing
will be given if the module contains an IMPLICIT NONE statement.
Default = no.
See also: -sixchar, -usage.
- -division
-
- This switch is provided to help users spot potential division
by zero problems. If this switch is selected, every division except
by a constant will be flagged. (It is assumed that the user is
intelligent enough not to divide by a constant which is equal to
zero!) Default = no.
See also: -portability, -truncation.
- -errors=num
-
- Set the maximum number of error messages in a ``cascade''.
During checking of agreement of subprogram arguments, common block
declarations, and so forth, sometimes a single case will generate a
long string of warnings. Often this simply indicates some other
cause than a genuine item-by-item mismatch, such as for example a
varible missing from one list. So in such cases ftnchek
stops printing the warnings after the cascade limit is reached, and
the trailer ``etc...'' is printed to indicate that there were more
errors not printed. If you think that these warnings are likely to
be genuine, use this setting to see more of them. Turn-on = default
= 3, max = 999. A value of 0 means no limit.
This setting does not set an overall limit on the number of
error messages printed, only the number printed in any one cascade.
Most types of warnings and error messages are not subject to the
cascade effect and so are not affected by this setting. To turn off
warnings generally, use the individual warning control options or
the -nocheck option.
See also: -check.
- -extern
-
- Causes ftnchek to report whether any subprograms invoked
by the program are never defined. Ordinarily, if ftnchek is
being run on a complete program, each subprogram other than the
intrinsic functions should be defined somewhere. Turn off this
switch if you just want to check a subset of files which form part
of a larger complete program. Subprogram arguments will still be
checked for correctness. Default = yes.
The -extern flag is now superseded by the
-usage=ext-undefined option. For the sake of convenience,
the -extern flag is retained, so that -noextern is
equivalent to -usage=no-ext-undefined option. The
-extern switch may be retired eventually.
See also: -library.
- -f77=list
-
- Use this setting to catch language extensions which violate the
Fortran 77 Standard. Such extensions may cause your program not to
be portable. Examples include the use of underscores in variable
names; variable names longer than six characters; statement lines
longer than 72 characters; and nonstandard statements such as the
DO ... ENDDO structure. ftnchek does not report on the use
of lowercase letters. By default, all warnings are turned off.
This setting provides detailed control over the warnings about
supported extensions to the Fortran 77 Standard. (Further details
about the extensions themselves are given below in the section on
Extensions.) The list consists of keywords separated by
commas or colons. There are three special keywords: all to
turn on all the warnings about nonstandard extensions, none
to turn them all off, and help to print the list of all the
keywords with a brief explanation of each. If list is
omitted, -f77 is equivalent to -f77=all, and
-nof77 is equivalent to -f77=none. The warning
keywords with their meanings are as follows:
- accept-type:
- ACCEPT and TYPE I/O statements.
- array-bounds:
- Expressions defining array bounds that contain array elements
or function references.
- assignment-stmt:
- Assignment statements involving arrays. In Fortran 90, an array
can be assigned to another array of compatible shape, or a scalar
can be assigned to an array. Neither of these assignments is
permitted in Fortran 77.
- A related warning occurs when an array is assigned to a scalar.
Since this is illegal also in Fortran 90, it is always warned about
regardless of the -f77 setting (unless all checking is
turned off with the -nocheck flag).
- attribute-based-decl:
- Type declarations in the new Fortran 90 attribute-based style.
This style of declaration is distinguished by the use of a double
colon (::) between the list of attributes and the list of declared
variables. This option also controls warnings for use of Fortran 90
length or kind specifiers in type declarations. (Although these
specifiers can be used in non-attribute-based declarations, they
are controlled by this option to avoid proliferation of -f77
options.)
- automatic-array:
- Local (not dummy) arrays which have variable size. These would
correspond to arrays whose storage would have to be dynamically
allocated at run time.
- backslash:
- Unix backslash escape in strings. This warning will be given
only if the -source=unix-backslash setting is specified to
cause the escape interpretation of backslash..
- byte:
- BYTE data type declaration.
- case-construct:
- The SELECT CASE construct.
- character:
- Extensions to the Fortran 77 standard regarding character data.
At present, this only controls warnings about character variables
declared with zero or negative length. In Fortran 77, all character
variables must be of positive length. In Fortran 90, they can be
zero length, and declarations that specify negative lengths are
permitted, turning into zero for the declared length. Note: because
negative length specifiers may indicate a programming error, the
warning about them is given even if this option is turned off, and
is suppressed only by the -nocheck flag.
- common-subprog-name:
- Common block and subprogram having the same name.
- construct-name:
- Use of a construct-name to label a control statement.
- continuation:
- More than 19 successive continuation lines.
- cpp:
- Unix C preprocessor directives in the source code.
- cray-pointer:
- ``Cray pointer'' syntax.
- cycle-exit:
- The CYCLE and EXIT statements.
- d-comment:
- Debugging comments starting with D in the source code.
- dec-tab:
- DEC Fortran style tab-formatted source code. This warning will
be given only if the -source=dec-tab setting is specified to
cause interpretation of tabs in this style.
- do-enddo:
- DO loop extensions: terminal statement label omitted, END DO,
and WHILE.
- double-complex:
- Double precision complex datatype.
- format-dollarsign:
- Dollar sign control code in FORMAT statements.
- format-edit-descr:
- Nonstandard edit descriptors in FORMAT statements.
- function-noparen:
- Function definition without parentheses.
- implicit-none:
- IMPLICIT NONE statement.
- include:
- INCLUDE statement.
- inline-comment:
- Inline comments starting with an exclamation point.
- internal-list-io:
- List-directed I/O to or from an internal file.
- intrinsic:
- Nonstandard intrinsic functions.
- io-keywords
- Nonstandard keywords used in I/O statements. These fall into
three groups. The first group includes keywords that are accepted
in Fortran 90:
| ACTION
| PAD
| READWRITE
|
| ADVANCE
| POSITION
| SIZE
|
| DELIM
| READ
| WRITE
|
| EOR
|
| |
The second group comprises the following
VMS Fortran keywords:
| BLOCKSIZE
| EXTENDSIZE
| READONLY
|
| BUFFERCOUNT
| INITIALSIZE
| RECORDSIZE
|
| CARRIAGECONTROL
| MAXREC
| RECORDTYPE
|
| DEFAULTFILE
| NAME (in OPEN)
| SHARED
|
| DISP
| NOSPANBLOCK
| TYPE
|
| DISPOSE
| ORGANIZATION
| |
(The keyword NAME is standard only in the
INQUIRE statement.) The third group consists of the following
IBM/MVS keyword:
This flag also controls a warning about
use of ACCESS='APPEND', which is accepted by some compilers. The
value of 'APPEND' is not valid for any I/O specifier in standard
Fortran 77, and in Fortran 90 'APPEND' should be used as a value of
the POSITION specifier, not ACCESS.
- long-line:
- Statements with meaningful code past 72 columns. This warning
is given only if the -columns setting has been used to
increase the statement field width.
- long-name:
- Identifiers over 6 characters long.
- mixed-common:
- Mixed character and noncharacter data in COMMON block.
- mixed-expr:
- Nonstandard type combinations in expressions, for example
DOUBLE PRECISION with COMPLEX, assigning hollerith to integer,
logical operations on integers.
- name-dollarsign:
- Dollar sign used as a character in identifiers.
- name-underscore:
- Underscore used as a character in identifiers.
- namelist:
- NAMELIST statement.
- param-implicit-type:
- Implicit typing of a parameter by the data type of the value
assigned. This warning can only occur if implicit parameter typing
has been turned on by the -source=param-implicit-type
option, or if the PARAMETER statement is of the nonstandard form
without parentheses. If this option is turned on, then any
instances where implicit parameter typing occurs will be warned
about. If you want to be warned only in those instances where the
implicit data type differs from the default type, use
-portability=param-implicit-type instead. According to the
Fortran 77 standard, the data type of a parameter is given by the
same rules as for a variable, and if necessary a type conversion is
done when the value is assigned.
- param-intrinsic:
- Intrinsic function or exponentiation by a real used to define
the value of a PARAMETER definition.
- param-noparen:
- PARAMETER statement without parentheses. The user should be
aware that the semantics of this form of the statement differs from
that of the standard form: in this form, the parameter takes its
data type from the value assigned, rather than having its default
data type based on the first letter of the parameter name. (This
form of the PARAMETER statement was introduced by DEC before the
Fortran 77 standard was defined, and should be avoided.)
- pointer:
- Fortran 90 standard pointer-related syntax, including POINTER,
TARGET and ALLOCATABLE type declarations, ALLOCATE, DEALLOCATE, and
NULLIFY statements, and pointer assignment using =>.
- quad-constant:
- Quad precision real constants, e.g. of the form 1.23Q4.
- quotemark:
- Strings delimited by quote marks rather than apostrophes.
- relops:
- Relational (comparison) operators composed of punctuation,
namely: < <= == /= > >=.
- semicolon:
- Semicolon used as statement separator.
- statement-order:
- Statements out of the sequence mandated by the Standard. The
allowed sequence is illustrated in Table 1 in the section on
Interpreting the Output.
- typeless-constant:
- Typeless constants, for example Z'19AF'.
- type-size:
- Type declarations specifying a size, for example REAL*8.
- variable-format:
- Variable repeat specification or field size in FORMAT. These
are of the form < expr >.
- vms-io:
- Obsolete. Now has the same meaning as the io-keywords
keyword.
See also: -f90, -f95, -portability,
-pretty, -style, -wordsize.
- -f90=list
-
- This setting provides detailed control over the warnings about
supported extensions to the Fortran 77 Standard that were not
adopted as part of the Fortran 90 Standard. Note that
ftnchek does not support the full Fortran 90 language.
However, it does support some common extensions to Fortran 77 that
were prevalent before Fortran 90 was defined. Some of these
extensions became part of the Fortran 90 Standard, but others did
not. The -f90 setting warns only about the latter. That is,
this flag covers things that are neither legal Fortran 77 nor legal
Fortran 90. Therefore, the warnings controlled by this flag are
basically a subset of the warnings controlled by -f77. There
are a few cases, described below, where the circumstances in which
the warning is given are slightly different for the two flags.
The list consists of keywords separated by commas or
colons. There are three special keywords: all to turn on all
the warnings about nonstandard extensions, none to turn them
all off, and help to print the list of all the keywords with
a brief explanation of each. If list is omitted, -f90
is equivalent to -f90=all, and -nof90 is equivalent
to -f90=none.
The following keywords have identical meanings for -f90
as for -f77. The reader is referred to the explanations
under -f77.
| accept-type
| double-complex
| param-noparen
|
| backslash
| format-dollarsign
| cray-pointer
|
| byte
| format-edit-descr
| quad-constant
|
| cpp
| function-noparen
| type-size
|
| d-comment
| name-dollarsign
| variable-format
|
| dec-tab
| param-implicit-type
| vms-io |
The keywords which differ somewhat from the corresponding
-f77 keywords are as follows.
- continuation:
- The limit on the number of continuation lines for a statement
in fixed source form is the same, namely 19, in Fortran 90 as in
Fortran 77. For free source form the limit is 39 continuation
lines, and a line containing a continuation mark cannot be
otherwise empty or contain only a comment.
- intrinsic:
- This is the same as for -f77 except for the intrinsic
functions defined in MIL-STD 1753, which are all included in
Fortran 90, and so are not warned about. (See -intrinsic for
a list.)
- io-keywords:
- This is the same as for -f77 except that no warnings are
given for the I/O keywords that are standard in Fortran 90.
- long-line:
- Although the Fortran 90 Standard allows lines longer than 72
characters in free source form, this restriction still applies to
fixed source form. In free source form the line length limit is 132
characters, and unlike fixed form, ftnchek does not allow
this limit to be increased.
- mixed-expr:
- This is the same as for -f77 except for expressions
mixing extended precision real with complex data types, which are
permitted in Fortran 90.
- statement-order:
- This is similar to the corresponding -f77 warning, but
applies the somewhat looser restrictions on statement order of the
Fortran 90 Standard. In particular, Fortran 90 allows DATA
statements and statement-function definitions to be intermixed with
specification statements.
- typeless-constant:
- In Fortran 90, binary, octal, and hexadecimal constants of the
form B'ddd', O'ddd', and Z'ddd', respectively, are permitted. Here
'ddd' represents a string of digits. ftnchek recognizes
these forms, as well as a variant of the form X'ddd' for a
hexadecimal constant, and other variants in which the base
indicator B, O, Z, or X follows the digit string. These variants
were not adopted in Fortran 90, so only they are warned about when
this flag is turned on.
See also: -f77, -f95, -portability,
-pretty, -style, -wordsize.
- -f95=list
-
- This setting provides detailed control over warnings about
standard Fortran 77 features that were deleted from the Fortran 95
Standard. Unlike the -f77 and -f90 settings, these
warnings apply to syntax which is legal Fortran 77. However, since
these features have been deleted from the Standard, it is possible
that programs containing them will be unacceptable to some newer
compilers.
The list consists of keywords separated by commas or
colons. There are three special keywords: all to turn on all
the warnings about nonstandard extensions, none to turn them
all off, and help to print the list of all the keywords with
a brief explanation of each. If list is omitted, -f95
is equivalent to -f95=all, and -nof95 is equivalent
to -f95=none. The warning keywords with their meanings are
as follows.
- real-do:
- A DO variable of any real numeric type.
- pause:
- The PAUSE statement.
- assign:
- The ASSIGN statement, assigned GOTO, or assigned format.
- h-edit:
- The H edit descriptor in a format.
There is one other Fortran 77 syntax feature that was deleted in
Fortran 95, namely branching to an ENDIF from outside the IF block.
However, ftnchek is unable to analyze program flow, and so
it does not provide a warning for this.
See also: -f77, -f90, -portability,
-pretty, -style, -wordsize.
- -help
-
- Prints a list of all the command-line options with a short
description of each along with its default value. This command is
identical in function to the ``?'' argument, and is provided
as a convenience for those systems in which the question mark has
special meaning to the command interpreter. Default = no.
The help listing also prints the version number and patch level
of ftnchek and a copyright notice.
Note: the ``default'' values printed in square brackets in the
help listing are, strictly speaking, not the built-in defaults but
the current values after any environment options and any
command-line options preceding the -help option have been
processed.
See also: -novice, -version, and help
option of all settings that take a list of keywords.
- -identifier-chars=list
-
- Define non-alphanumeric characters that may be used in
identifiers. By default, ftnchek only accepts the dollar
sign and underscore as non-alphanumeric characters in identifier
names. The characters in the list replace whatever set of
accepted non-alphanumeric characters was previously in effect.
Thus, if dollar sign or underscore are not included in the list,
they lose their status as acceptable characters.
This option is provided to enable ftnchek to handle
source files containing non-standard identifer names that may be
needed, for example, to access certain operating system services.
See the section on Limitations and Extensions for the treatment of
identifiers containing these characters in implicit typing.
Using -noidentifer-chars turns off acceptance of
non-alphanumeric characters entirely.
See also: -source.
- -include=path
-
- Specifies a directory to be searched for files specified by
INCLUDE statements. Unlike other command-line options, this setting
is cumulative; that is, if it is given more than once on the
command line, all the directories so specified are placed on a list
that will be searched in the same order as they are given. The
order in which ftnchek searches for a file to be included
is: the current directory; the directory specified by environment
variable FTNCHEK_INCLUDE if any; the directories specified by any
-include options; the directory specified by environment
variable INCLUDE; and finally in a standard system-wide directory
(/usr/include for UNIX, SYS$LIBRARY for VMS, and \include for
MSDOS).
See also: -f77, -source.
- -intrinsic=list
-
- Controls whether ftnchek recognizes certain nonstandard
intrinsic functions as intrinsic. The list consists of
keywords separated by commas or colons. Some of the keywords
control whether to recognize certain groups of functions, and other
keywords control the expected syntax for invoking some nonstandard
intrinsics. Include a keyword to turn on recognition of the
corresponding set of intrinsics or to allow the corresponding
syntax. Include a keyword prefixed by no- to turn off that
recognition.
There are three special keywords: all turns on
recognition of all the nonstandard intrinsics (listed below) and
accepts either syntax for those that have variations. Use
none to turn off recognition of all nonstandard intrinsics
except those noted below. Use help to print the list of all
the keywords with a brief explanation of each. If list is
omitted, -intrinsic is equivalent to -intrinsic=all,
and -nointrinsic is equivalent to -intrinsic=none.
The nonstandard intrinsic functions needed to support the
nonstandard extended precision data types (double complex and quad
precision) are always recognized. The intrinsics for the double
complex data type are:
| CDABS
| CDSQRT
| DREAL
| ZLOG
|
| CDCOS
| DCMPLX
| IMAG
| ZSIN
|
| CDEXP
| DCONJG
| ZABS
| ZSQRT
|
| CDLOG
| DIMAG
| ZEXP
| ZCOS
|
| CDSIN
|
|
| |
The intrinsics for the quad precision and
quad complex types are:
| CQABS
| QARCOS
| QEXT
| QNINT
|
| CQCOS
| QARSIN
| QEXTD
| QPROD
|
| CQEXP
| QATAN
| QFLOAT
| QREAL
|
| CQLOG
| QATAN2
| QIMAG
| QSIGN
|
| CQSIN
| QCMPLX
| QINT
| QSIN
|
| CQSQRT
| QCONJG
| QLOG
| QSINH
|
| DBLEQ
| QCOS
| QLOG10
| QSQRT
|
| IQINT
| QCOSH
| QMAX1
| QTAN
|
| IQNINT
| QDIM
| QMIN1
| QTANH
|
| QABS
| QEXP
| QMOD
| SNGLQ |
The keywords controlling recognition
of other nonstandard intrinsic functions are as follows:
- extra:
- recognize the following commonly available nonstandard
intrinsics (all except EXIT and LOC are defined in MIL-STD 1753):
| BTEST
| IBCLR
| IEOR
| ISHFTC
|
| EXIT
| IBITS
| IOR
| LOC
|
| IAND
| IBSET
| ISHFT
| NOT |
- unix:
- recognize these common Unix-specific intrinsic functions:
| ABORT
| GMTIME
| LTIME
| SRAND
|
| AND
| IARGC
| OR
| SYSTEM
|
| GETARG
| IRAND
| RAND
| TIME
|
| GETENV
| LSHIFT
| RSHIFT
| XOR |
- vms:
- recognize these common VMS-specific intrinsic functions:
| DATE
| IDATE
| SECNDS
| TIME
|
| ERRSNS
| RAN
| SIZEOF
| |
- iargc-no-argument:
- specify that IARGC may be invoked with no arguments.
- iargc-one-argument:
- specify that IARGC may be invoked with one argument.
- rand-no-argument:
- specify that RAND and IRAND may be invoked with no arguments.
- rand-one-argument:
- specify that RAND and IRAND may be invoked with one
argument.
The no-argument and one-argument keywords work as
follows: turning the option on causes ftnchek to accept the
corresponding syntax for invocation of the function, without
excluding the possibility of the alternative syntax. Turning the
option off causes the corresponding syntax not to be accepted. If
both options are turned on at once (the default), then either
syntax is accepted. Turning both options off at once would not be
meaningful. These options have no effect if recognition of Unix
intrinsics has been turned off.
Note that this setting does not control whether non-standard
warnings are issued about these functions. It controls whether the
functions are assumed to be intrinsic or not, which determines how
their usage is checked. When functions in any of these sets are
included, their invocations will be checked according to the rules
for the intrinsic functions; otherwise they will be checked as
normal (user-written) external functions. The non-standard warnings
are controlled by the -f77=intrinsic option.
The default value of this setting is equivalent to
-intrinsic=all followed by -intrinsic=no-vms for the
Unix version, -intrinsic=no-unix for the VMS version, and
-intrinsic=no-unix,no-vms for other versions.
Note: In versions of ftnchek prior to 2.10, the
-intrinsic flag took a numeric argument instead of a list of
options. For the sake of users who may have written scripts
invoking ftnchek in this way, the numeric form is still
accepted. The numeric form of the setting consists of three digits.
The ones digit selects the set of intrinsic functions to be
supported. The digit 0 selects only Fortran 77 standard intrinsics
plus those needed to support the nonstandard extended precision
data types. The digit 1 is equivalent to extra, 2 is
equivalent to extra,unix, and 3 is equivalent to
extra,vms. The tens digit of this setting controls the
syntax of the RAND intrinsic function, and the hundreds digit
controls the syntax of the IARGC function. For these digits,
specify 0 to require invocation with no argument, 1 to require one
argument, and 2 to allow either form.
See also: -f77.
- -library
-
- This switch is used when a number of subprograms are contained
in a file, but not all of them are used by the application.
Normally, ftnchek warns you if any subprograms are defined
but never used. This switch will suppress these warnings. Default =
no.
This switch also controls which subprogram calls and COMMON
block declarations are checked. If a file is read with the
-library flag in effect, the subprogram calls and COMMON
declarations contained in a routine in that file will be checked
only if that routine is in the main program's call tree. On the
other hand, if the -library switch is turned off, then
ftnchek checks the calls of every routine by every other
routine, regardless of whether those routines could ever actually
be invoked at run time, and likewise all COMMON block declarations
are compared for agreement.
The difference between this switch and the
-usage=no-ext-unused option for subprograms is that the
latter suppresses only the warning about routines being declared
but not used. The -library switch goes further and excludes
unused routines processed while it is in effect from all
cross-checking of arguments and COMMON block declarations as well.
(If there is no main program anywhere in the set of files that
ftnchek has read, so that there is no call tree, then
ftnchek will look for any non-library routines that are not
called by any other routine, and use these as substitutes for the
main program in constructing the call tree and deciding what to
check. If no such top-level non-library routines are found, then
all inter-module calls and all COMMON declarations will be
checked.)
See also: -arguments, -calltree, -common,
-extern, -usage.
- -list
-
- Specifies that a listing of the Fortran program is to be
printed out with line numbers. If ftnchek detects an error,
the error message follows the program line with a caret ( ^ )
specifying the location of the error. If no source listing was
requested, ftnchek will still print out any line containing
an error, to aid the user in determining where the error occurred.
Default = no.
See also: -output, \fB-symtab, fB-quiet.
- -makedcls=list
-
- Prepare a neatly-formatted file of declarations of variables,
common blocks, and namelist lists, for possible merging into the
source code. The declarations are stored in a file of the same name
as the source code, but with the extension changed to .dcl.
If no declarations are written to the file, it is deleted to reduce
clutter from empty files.
If input comes from standard input, instead of a named file,
then declarations are written to standard output.
Variables are declared in alphabetical order within each
declaration class and type, with integer variables first, because
of their later possible use in array dimensions.
PARAMETER statements are an exception to the alphabetical order
rule, because the Fortran 77 Standard requires that the expressions
defining parameter values refer only to constants and
already-defined parameter names. This forces the original source
file order of such statements to be preserved in the declaration
files.
Explicit declaration of all variables is considered good
modern programming practice. By using compiler options to reject
undeclared variables, misspelled variable names (or names extending
past column 72) can be caught at compile time. Explicit
declarations also greatly facilitate changing floating-point
precision with filters such as dtoq(1L),
dtos(1L),
fd2s(1L),
fs2d(1L),
qtod(1L),
and stod(1L).
These programs are capable of changing types of explicit
floating-point type declarations, intrinsic functions, and
constants, but because they do not carry out rigorous lexical and
grammatical analysis of the Fortran source code, they cannot
provide modified type declarations for undeclared variables.
Default setting = 0, turn-on = 1.
Various options for the form of the declarations file are
controlled by the list, which consists of keywords separated
by commas or colons. There are three special keywords: all
to turn on all the options, none to turn them all off, and
help to print the list of all the keywords with a brief
explanation of each. If list is omitted, -makedcls is
equivalent to -makedcls=declarations (i.e. produce the
declarations file using the default options), and
-nomakedcls is equivalent to -makedcls=none.
For compatibility with previous versions of ftnchek, a
numeric form of this setting is also accepted: the list is
replaced by a number which is the sum of the numbers in parentheses
beside the keywords in the following list. The warning keywords
with their meanings are as follows:
- declarations (1):
- Write a declaration file. (This is implied by any of the other
options, and can be omitted if any other options are given.)
- undeclared-only (2):
- By default, all variables are included in the declaration file.
With this option, include only undeclared variables. This
setting is useful if you want to check for undeclared variables,
since Fortran source files with all variables properly declared
will not result in a .dcl file. With this option, common
blocks and namelist lists will not be included in the declaration
file, since by their nature they cannot be undeclared.
- compact (4):
- The declarations are normally prettyprinted to line up neatly
in common columns, as in the declaration files output by the
Extended PFORT Verifier, pfort(1L).
This option value selects instead compact output, without column
alignment.
- use-continuation-lines (8):
- Causes continuation lines to be used where permissible. The
default is to begin a new declaration on each line. This option is
appropriate to use together with compact.
- keywords-lowercase (16):
- Output Fortran keywords in lowercase, instead of the default
uppercase.
- vars-and-consts-lowercase (32):
- Output variables and constants in lowercase, instead of the
default uppercase. Character string constants are not affected by
this option.
- exclude-sftran3 (64):
- Omit declarations of internal integer variables produced by the
SFTRAN3 preprocessor, xsf3(1L),
as part of the translation of structured Fortran statements to
ordinary Fortran. These variables have six-character names of the
form NPRddd, NXdddd, N2dddd, and
N3dddd, where d is a decimal digit. Because they are
invisible in the SFTRAN3 source code, and will change if the
SFTRAN3 code is modified, such variables should not be explicitly
declared. Instead, they should just assume the default Fortran
INTEGER data type based on their initial letter, N.
- asterisk-comment (128):
- Use an asterisk as the comment character; the default is
otherwise 'C'.
- comment-char-lowercase (256):
- Use 'c' instead of 'C' or '*' as the comment character.
- suppress-array-dimensions (512):
- Suppress dimensioning of arrays in the generated declarations.
This option is for use with code lacking type declarations, to
allow the declaration files to be inserted without change into the
code. Since the code will have dimension statements already,
dimensioning the array variables in the type statements of the
declaration file is redundant. This option should be used only in
conjunction with option 2 = undeclared-only because otherwise any
arrays that were dimensioned in a type statement will lose their
dimensioning.
- free-form (1024):
- Produce declarations in free source form. This mode is
automatically used if the input source is free form. Use this
option to produce declarations in free form even if the input is in
fixed form. Free form declarations are indented only 2 columns
instead of 6, use the exclamation mark as the comment character,
and indicate continuation lines by an ampersand at the end of the
line to be continued.
The declaration files contain distinctive comments that mark the
start and end of declarations for each program unit, to facilitate
using text editor macros for merging the declarations back into the
source code.
The ftnchek distribution includes a program,
dcl2inc, which processes declaration files to produce files
containing declarations of all COMMON blocks, in a form suitable
for use as INCLUDE files. See the dcl2inc(1L)
man page for the details of its use.
See also: -mkhtml.
- -mkhtml=list
-
- Produce HTML documentation from source. Creates individual HTML
files from ftnchek analysis and code comments. All comments
immediately preceding and following the function or subroutine
definition are captured to the HTML file. No reformatting of source
comments is performed other than stripping of FORTRAN comment
characters. In addition, the HTML file lists the local variables
declared, common block variables used, functions and subroutines
called, I/O unit usage, and other information about each
subprogram. Usually you will also want to specify -call=tree
to create the root HTML file CallTree.html. (Perhaps this file
should be named index.html.)
Various options for the form of the HTML files are controlled by
the list, which consists of keywords separated by commas or
colons. There are three special keywords: all to turn on all
the options, none to turn them all off, and help to
print the list of all the keywords with a brief explanation of
each. If list is omitted, -mkhtml is equivalent to
-mkhtml=documents (i.e. produce the HTML document files
using the default options), and -nomkhtmls is equivalent to
-mkhtml=none.
For the sake of simplicity, the options for -mkhtml are
the same as those for -makedcls except for those that are
inapplicable. Likewise, a numeric form of this setting can be used,
formed as the sum of the numbers in parentheses in the list below.
The warning keywords with their meanings are as follows:
- documents (1):
- Create the HTML documents. (This is implied by any of the other
options, and can be omitted if any other options are given.)
- compact (4):
- The declarations are normally prettyprinted to line up neatly
in common columns. This option value selects instead compact
output, without column alignment.
- use-continuation-lines (8):
- Causes continuation lines to be used instead of beginning a new
declaration on each line. This option is appropriate to use
together with compact.
- keywords-lowercase (16):
- Output Fortran keywords in lowercase, instead of the default
uppercase.
- vars-and-consts-lowercase (32):
- Output variables and constants in lowercase, instead of the
default uppercase. Character string constants are not affected by
this option.
- exclude-sftran3 (64):
- Omit declarations of internal integer variables produced by the
SFTRAN3 preprocessor, xsf3(1L).
(See -makedcls for discussion.)
- suppress-array-dimensions (512):
- Suppress dimensioning of arrays in the generated declarations.
This is normally undesirable, but is available if for some reason
you do not want the array dimensions to appear in the HTML.
- free-form (1024):
- Produce variable declarations in free source form. This mode is
automatically used if the input source is free form. This mainly
affects the form of continuation lines if they are used.
See also: -calltree, -makedcls.
- -novice
-
- This flag is intended to provide more helpful output for
beginners. It has two effects:
- (a)
- provides an extra message to the effect that a function that is
used but not defined anywhere might be an array which the user
forgot to declare in a DIMENSION statement (since the syntax of an
array reference is the same as that of a function reference).
- (b)
- modifies the form of the error messages and warnings. If the
flag is turned off by -nonovice, these messages are printed
in a style more resembling UNIX lint.
Default = yes.
- -output=filename
- This setting is provided for convenience on systems which do
not allow easy redirection of output from programs. When this
setting is given, the output which normally appears on the screen
will be sent instead to the named file. Note, however, that
operational errors of ftnchek itself (e.g. out of space or
cannot open file) will still be sent to the screen. The extension
for the filename is optional, and if no extension is given, the
extension .lis will be used.
- -pointersize=num
-
- Specifies the size of a ``Cray pointer'' variable to be
num bytes. Default = turn-on = 4 bytes.
The pointer size is used to inform precision mismatch warnings
involving pointer variables, for example when a pointer is assigned
a value from an allocation routine, or passed as a subprogram
parameter.
See also: -f77, -portability, -truncation,
-wordsize.
- -portability=list
-
- ftnchek will give warnings for a variety of non-portable
usages. Examples include the use of tabs except in comments or
inside strings, the use of Hollerith constants, and the
equivalencing of variables of different data types. This option
does not produce warnings for supported extensions to the Fortran
77 Standard, which may also cause portability problems. To catch
those, use the -f77 setting. By default, all warnings are
turned off.
This setting provides detailed control over the warnings about
possible portability problems. The list consists of keywords
separated by commas or colons. There are three special keywords:
all to turn on all the warnings about nonportable usages,
none to turn them all off, and help to print the list
of all the keywords with a brief explanation of each. If
list is omitted, -portability is equivalent to
-portability=all, and -noportability is equivalent to
-portability=none. The warning keywords with their meanings
are as follows:
- backslash:
- Backslash character in strings. Since some compilers treat the
backslash as an escape character, its presence can cause problems
even though it is used in a standard-conforming way.
- common-alignment:
- COMMON block variables not in descending order of storage size.
Some compilers require this ordering because of storage alignment
requirements.
- hollerith:
- Hollerith constants (other than within FORMAT specifications).
The Hollerith data type is a feature of Fortran IV that has been
deleted in the Fortran 77 standard. It is superseded by the
character data type. Storing Hollerith data in variables of a
numeric or logical data type is nonportable due to differing word
sizes.
- long-string:
- String constants, variables, or expressions over 255 chars
long.
- mixed-equivalence:
- Variables of different data types equivalenced.
- mixed-size:
- Variables declared with default precision used with variables
given explicit precision, in expressions, assignments, or as
arguments. For example, if a variable declared as REAL*8 is treated
as equivalent to DOUBLE PRECISION.
- real-do:
- Non-integer DO loop index and bounds. These can cause a
program's results to depend on the hardware characteristics of the
particular computer used.
- param-implicit-type:
- Implicit typing of a parameter by the data type of the value
assigned, if it differs from the default type. This warning can
only occur if implicit parameter typing has been turned on by the
-source=param-implicit-type option, or if the PARAMETER
statement is of the nonstandard form without parentheses. If this
option is turned on, then any instances where implicit parameter
typing occurs and where the implicit type is different from the
default type based on the first letter of the parameter name, will
be warned about. Implicit parameter typing can change the semantics
of statements where the parameter is used, causing portability
problems.
- tab:
- Tabs in source code. Tabs are interpreted differently by
different compilers. This warning will be given only once, at the
end of the file.
See also: -f77, -f90, -f95, -pretty,
-style, -wordsize.
- -pretty=list
-
- Controls certain messages related to the appearance of the
source code. These warn about things that might make a program less
readable or be deceptive to the reader. By default, all warnings
are turned on.
This setting provides detailed control over the warnings about
appearance. The list consists of keywords separated by
commas or colons. Since all warnings are on by default, include a
keyword prefixed by no- to turn off a particular warning.
There are three special keywords: all to turn on all the
warnings about misleading appearances, none to turn them all
off, and help to print the list of all the keywords with a
brief explanation of each. If list is omitted,
-pretty is equivalent to -pretty=all, and
-nopretty is equivalent to -pretty=none. The warning
keywords with their meanings are as follows:
- alternate-return:
- A RETURN statement has a constant specifying an alternate
return point that is not between 0 and the number of dummy
arguments that are labels. This is legal, and has the same effect
as a RETURN with no alternate return expression, but suggests that
the programmer intended to use an alternate return label that is
not provided.
- embedded-space:
- Space embedded in variable names or in multi-character
operators such as **.
- continuation:
- Continuation mark following a comment line.
- long-line:
- Lines (except comments) over 72 columns in width (beyond 72 is
normally ignored by compiler).
- missing-space:
- Lack of space between variable and a preceding keyword.
- multiple-common:
- COMMON block declared in multiple statements. No warning is
given if the statements are consecutive except for comment lines.
- multiple-namelist:
- NAMELIST declared in multiple statements. No warning is given
if the statements are consecutive except for comment lines.
- parentheses:
- Parentheses around a variable by itself. As a subprogram
argument, this makes the argument an expression, not modifiable by
the subprogram.
Note that in free source form, extra space and missing space are
forbidden by the Fortran 90 Standard, and are not mere style
violations. In this case the warnings are replaced by syntax error
messages, and can be turned off only by using -nocheck.
See also: -f77, -portability, -style.
- -project=list
-
- ftnchek will create a project file from each source file
that is input while this option is turned on. The project file will
be given the same name as the input file, but with the extension
.f or .for replaced by .prj. (If input is from
standard input, the project file is named ftnchek.prj.)
Default = none.
The list consists of keywords separated by commas or
colons. There are three special keywords: all to turn on all
the options, none to turn them all off, and help to
print the list of all the keywords with a brief explanation of
each. If list is omitted, -project is equivalent to
-project=all, and -noproject is equivalent to
-project=none. The keywords with their meanings are as
follows:
- create:
- Produce a project file. The default is not to produce a project
file. If this option is not turned on, the other options have no
effect.
- trim-calls:
- Trim the amount of information stored in the project file about
subprogram declarations and calls. This is the default. Turn this
option off only in rare situations. (See discussion below.) The
amount of trimming varies depending on the -library flag.
More information is trimmed if that flag is turned on.
- trim-common:
- Trim the number of common block declarations stored in the
project file. This is the default. Turn this option off only in
rare situations. (See discussion below.) This option has no effect
if the -library flag is turned off: when not in library
mode, no trimming of common block declarations is done regardless
of this option.
A project file contains a summary of information from the source
file, for use in checking agreement among FUNCTION, SUBROUTINE, and
COMMON usages in other files. It allows incremental checking, which
saves time whenever you have a large set of files containing shared
subroutines, most of which seldom change. You can run
ftnchek once on each file with the -project flag set,
creating the project files. Usually you would also set the
-library and -noextern flags at this time, to
suppress messages relating to consistency with other files. Only
error messages pertaining to each file by itself will be printed at
this time. Thereafter, run ftnchek without these flags on
all the project files together, to check consistency among the
different files. All messages internal to the individual files will
now be omitted. Only when a file is altered will a new project file
need to be made for it.
Naturally, when the -project option is turned on,
ftnchek will not read project files as input.
Ordinarily, the trim options should be left on when you intend
to create project files for future input to ftnchek. Since
trimming is on by default, this means that simply giving the
command -project with no option list is the recommended
mode. The trim options are provided only as a convenience for those
who want to make use of project files for purposes other than
checking the program with ftnchek. To use project files for
their intended purpose, the trim options should not be turned off.
Project files contain only information needed for checking
agreement between files. This means that a project file is of no
use if all modules of the complete program are contained in a
single file.
A more detailed discussion is given in the section on Using
Project Files.
- -pure
-
- Assume functions are ``pure'', i.e., they will not have side
effects by modifying their arguments or variables in a COMMON
block. When this flag is in effect, ftnchek will base its
determination of set and used status of the actual arguments on the
assumption that arguments passed to a function are not altered. It
will also issue a warning if a function is found to modify any of
its arguments or any COMMON variables. Default = yes.
When this flag is turned off, actual arguments passed to
functions will be handled the same way as actual arguments passed
to subroutines. This means that ftnchek will assume that
arguments may be modified by the functions. No warnings will be
given if a function is found to have side effects. Because stricter
checking is possible if functions are assumed to be pure, you
should turn this flag off only if your program actually uses
functions with side effects.
- -quiet
-
- This option reduces the amount of output relating to normal
operation, so that error messages are more apparent. This option is
provided for the convenience of users who are checking large suites
of files. The eliminated output includes the names of project
files, and the message reporting that no syntax errors were found.
It also eliminates some blank lines that are ordinarily included
for clarity. (Some of this output is turned back on by the
-list and -symtab options.) Default = no.
Note: the way to remember the difference between the
-quiet and -brief is that -quiet doesn't
suppress any warning-related information, whereas -brief
does.
See also: -brief.
- -reference
-
- Specifies that a who-calls-who table be printed. This table
lists each subprogram followed by a list of the routines it calls.
This switch is equivalent to -calltree=reference. Default =
no.
The reference list omits routines called by unused library
modules. Thus it contains the same information as for the call-tree
format, namely the hierarchy of subprogram calls, but printed in a
different way. This prints out a breadth-first traversal of the
call tree whereas -calltree=tree prints out a depth-first
traversal.
See also: -calltree, -crossref, -library,
-sort, -symtab, -vcg.
- -resources
-
- Prints the amount of resources used by ftnchek in
processing the program. This listing may be useful in analyzing the
size and complexity of a program. It can also help in choosing
larger sizes for ftnchek's internal tables if they are too
small to analyze a particular program. Default = no.
In this listing, the term ``chunk size'' is the size of the
blocks of memory allocated to store the item in question, in units
of the size of one item, not necessarily in bytes. When the
initially allocated space is filled up, more memory is allocated in
chunks of this size. The following is an explanation of the items
printed:
- Source lines processed:
- Total number of lines of code, with separate totals for
statement lines and comment lines. Comment lines include lines with
'C' or '*' in column 1 as well as blank lines and lines containing
only an inline comment. Statement lines are all other lines,
including lines that have an inline comment following some code.
Continuation lines are counted as separate lines. Lines in include
files are counted each time the file is included.
- Total executable statements:
- Number of statements in the program, other than specification,
data, statement-function, FORMAT, ENTRY, and END statements.
- Total number of modules:
- A module is any external subprogram, including the main
program, subroutines, functions, and block data units. This count
is of modules defined within the source, not modules referenced.
Statement functions are not included. A subprogram with multiple
entry points is only counted once.
- Total statement labels defined
- Number of labels attached to statements (often called statement
numbers). The total label count for the entire program is given, as
well as the maximum number in any single subprogram.
- Max identifier name chars:
- Number of characters used for storing identifier names. An
identifier is a variable, subprogram, or common block name. Local
names are those of local variables in a subprogram, whereas global
names refer to subprogram and common block names, as well as dummy
argument names and common variable names. Actual argument text (up
to 15 characters for each argument) is also included here. The
space used for local names is not recovered at the end of each
module, so this number, like global space, grows until the whole
program is analyzed. Unfortunately, this figure may include some
text stored more than once, although a heuristic is used that will
avoid duplicates in many cases.
- Max token text chars:
- A token is the smallest syntactic unit of the FORTRAN language
above the level of individual characters. For instance a token can
be a variable name, a numerical constant, a quoted text string, or
a punctuation character. Token text is stored while a module is
being processed. For technical reasons, single-character tokens are
not included in this total. Items that are not represented in the
symbol table may be duplicated. The space for token text is
recovered at the end of each module, so this figure represents the
maximum for any one module.
- Max local symbols:
- This is the largest number of entries in the local symbol table
for any module. Local symbol table entries include all variables
and parameters, common block names, statement functions, external
subprograms and intrinsic functions referenced by the module.
Literal constants are not stored in the local symbol table.
- Max global symbols:
- This is the number of entries in the global symbol table at the
end of processing. Global symbol table entries include external
subprogram and common block names. Intrinsic functions and
statement functions are not included.
- Max number of tokenlists:
- A token list is a sequence of tokens representing the actual or
dummy argument list of a subprogram, or the list of variables in a
common block or namelist. Therefore this number represents the
largest sum of COMMON, CALL, NAMELIST and ENTRY statements and
function invocations for any one module. The space is recovered at
the end of each module.
- Max token list/tree space:
- This is the largest number of tokens in all the token lists and
token trees of any one module. A token tree is formed when
analyzing an expression: each operand is a leaf of the tree, and
the operators are the nodes. Therefore this number is a measure of
the maximum complexity of an individual module. For instance a
module with many long arithmetic expressions will have a high
number. Note that unlike token text described above, the number of
tokens is independent of the length of the variable names or
literal constants in the expressions.
- Number of subprogram invocations:
- This is the sum over all modules of the number of CALL
statements and function invocations (except intrinsic functions and
statement functions).
- Number of common block decls:
- This is the sum over all modules of the number of common block
declarations. That is, each declaration of a block in a different
module is counted separately. (The standard allows multiple
declarations of a block within the same module; these are counted
as only one declaration since they are equivalent to a single long
declaration.)
- Number of array dim & param ptrs:
- This is the sum over all modules of the number of array
dimension and parameter definition text strings saved for use by
the -makedcls option. The length of the text strings is not
counted. Each dimension of a multidimensional array is counted
separately.
These numbers are obviously not the same when project files are
used in place of the original source code. Even the numbers for
global entities may be different, since some redundant information
is eliminated in project files.
- -sixchar
-
- One of the goals of the ftnchek program is to help users
to write portable Fortran programs. One potential source of
nonportability is the use of variable names that are longer than
six characters. Some compilers just ignore the extra characters.
This behavior could potentially lead to two different variables
being considered as the same. For instance, variables named
AVERAGECOST and AVERAGEPRICE are the same in the first six
characters. If you wish to catch such possible conflicts, use this
flag. Default = no.
Use the -f77=long-names if you want to list all
variables longer than six characters, not just those pairs that are
the same in the first six.
See also: -f77, -portability.
- -sort
-
- Specifies that a sorted list of all modules used in the program
be printed. This list is in ``prerequisite'' order, i.e. each
module is printed only after all the modules from which it is
called have been printed. This is also called a ``topological
sort'' of the call tree. Each module is listed only once. Routines
that are not in the call tree of the main program are omitted. If
there are any cycles in the call graph (illegal in standard
Fortran) they will be detected and diagnosed. Default = no.
See also: -calltree, -crossref, -reference,
-symtab, -vcg.
- -source=list
-
- This setting controls certain options about the form of the
Fortran source code. The list consists of keywords separated
by commas or colons. There are three special keywords: all
to turn on all the options, none to turn them all off, and
help to print the list of all the keywords with a brief
explanation of each. If list is omitted, -source is
equivalent to -source=all, and -nosource is
equivalent to -source=none.
For compatibility with previous versions of ftnchek, a
numeric form of this setting is also accepted: the list is
replaced by a number which is the sum of the numbers in parentheses
beside the keywords in the following list. (The fixed and
free options do not have numeric values.) The warning
keywords with their meanings are as follows:
- fixed:
- Interpret the source as fixed form (with supported extensions
such as exclamation mark for comments). Statements must be in
columns 7 to 72 (unless the -cols setting has been used to
change this), and blanks are not significant outside character
context (but warned about under the -pretty option). This is
the default mode unless the source file extension is .f90 or
.F90. this option cannot be given together with
-source=free.
- free:
- Interpret the source as free form. Statements may be anywhere
in columns 1 to 132, comments can only begin with an exclamation
mark, and blanks are required in some places such as between
identifiers and keywords. This is the default mode if the source
file extension is .f90 or .F90. This option cannot be
given together with -source=fixed or -source=dec-tab
- dec-tab (1):
- Accept DEC-style tab-formatted source. A line beginning with an
initial tab will be treated as a new statement line unless the
character after the tab is a nonzero digit, in which case it is
treated as a continuation line. The next column after the tab or
continuation mark is taken as column 7. A warning will be given in
the case where the line is a continuation, if -f77=dec-tab
is in effect.
- vms-include (2):
- Accept VMS-style INCLUDE statements. These follow the normal
syntax, but with the following additional features: (1) the file
extension, if not given, defaults to the same as a normal source
file extension; and (2) the option /LIST or /NOLIST can be appended
to the include-file name, to control listing of its contents.
- unix-backslash (4):
- Handle UNIX-style backslash escapes in character strings. The
escape sequence following the backslash will be evaluated according
to the ANSI standard for strings in C: up to three digits signify
an octal value, an x signifies the start of a hexadecimal constant,
any of the letters a b f n r t signify special control codes, and
any other character (including newline) signifies the character
itself. When this source code option is in effect, a warning will
be given if the -f77=backslash setting is specified.
- The default behavior is to treat the backslash like any other
normal character, but a warning about portability will be generated
if the -portability flag is set. Because of the fact that
some compilers treat the backslash in a nonstandard way, it is
possible for standard-conforming programs to be non-portable if
they use the backslash character in strings.
- Since ftnchek does not do much with the interpreted
string, it is seldom necessary to use this option. It is needed in
order to avoid spurious warnings only if (a) the program being
checked uses backslash to embed an apostrophe or quote mark in a
string instead of using the standard mechanism of doubling the
delimiter; (b) the backslash is used to escape the end-of-line in
order to continue a string across multiple source lines; or (c) a
PARAMETER definition uses an intrinsic string function such as LEN
with such a string as argument, and that value is later used to
define array dimensions, etc.
- param-implicit-type (8):
- Implicit typing of a parameter by the data type of the value
assigned. Some non-standard compilers may allow the data type of
the value to override the Fortran 77 default type of a parameter
that is based on the first letter of the parameter name. This
option only applies to PARAMETER statements of the standard form
which has parentheses. A parameter that has been explicitly
declared in a type statement prior to the PARAMETER statement is
not affected by this option. A warning will be given under the
-f77=param-implicit-type or
-portability=param-implicit-type option.
- Note that this implicit typing is treated as equivalent to an
explicit type declaration for the parameter. Therefore, if you use
-makedcls=undeclared-only to generate declarations only of
undeclared variables, these parameters will not be included.
- dec-param-standard-type (16):
- Follow the Fortran 77 rule for data typing of DEC Fortran style
parameters. These are declared using a nonstandard form of the
PARAMETER statement which lacks parentheses. According to DEC
Fortran, parameters defined by this form of the statement have
their data type given by the data type of the value assigned. Use
this option to tell ftnchek not to follow this rule but
instead to use the same rule as for standard PARAMETER statements.
This option does not apply to PARAMETER statements of the standard
form.
By default, all these source code options are turned off, except
for the vms-include option, which is on by default in the
VMS version..
See also: -f77, -include,
-portability.
- -style=list
-
- Provides extra-picky warnings about obsolescent or
old-fashioned programming constructions. This option is helpful for
efforts to follow a modern programming style. (Most of the things
complained about under this option are forbidden in the F
subset language.) By default, all warnings are turned off.
The list consists of keywords separated by commas or
colons. There are three special keywords: all to turn on all
the options, none to turn them all off, and help to
print the list of all the keywords with a brief explanation of
each. If list is omitted, -style is equivalent to
-style=all, and -nostyle is equivalent to
-style=none. The warning keywords with their meanings are as
follows:
- block-if:
- Complain about arithmetic IF statement. Accept block IF or
logical IF (which controls a single statement).
- construct-name:
- Complain about unnamed block constructs: IF, DO, and SELECT
CASE. Note that if a construct name is present on the opening
statement of a construct, then it is required to be present on all
other component statements (ELSE, END IF, etc.) of the construct.
In that case a missing construct name on those statements generates
a syntax error regardless of this option. The purpose of this
option is to warn if the construct completely lacks the optional
name.
- distinct-do:
- Complain if two DO loops share a common terminator statement.
- do-construct:
- Complain if terminator of a DO loop is anything other than an
END DO or CONTINUE statement. This is the requirement in order for
the loop to meet the Fortran 90 definition of a do-construct.
- do-enddo:
- Complain if terminator of a DO loop is anything other than an
END DO statement. (This option overrides the do-construct
option, being even stricter.)
- end-name:
- Complain about the absence of the subprogram name on structured
END statements.
- format-stmt:
- Complain about the presence of FORMAT statements. Only the
FORMAT statements themselves are flagged, not the references to
them in I/O lists.
- goto:
- Complain about the presence of unconditional, computed or
assigned GOTO statements. Also complain about alternate returns
(but not about labels as subprogram arguments).
- labeled-stmt:
- Complain about the presence of labels (numbers) on statements
other than FORMAT statements. (Since FORMAT statements are arguably
convenient and not readily abused, complaints about them are
controlled by the separate format-stmt keyword.)
- program-stmt:
- Complain about the absence of a PROGRAM statement at the head
of the main program.
- structured-end:
- Complain about the use of a plain END statement to end a
subprogram, rather than a structured END statement (END PROGRAM,
END SUBROUTINE, END FUNCTION, or END BLOCK DATA).
See also: -f77, -f90, -f95, -pretty,
-portability.
- -symtab
-
- A symbol table will be printed out for each module, listing all
identifiers mentioned in the module. This table gives the name of
each variable, its datatype, and the number of dimensions for
arrays. An asterisk (*) indicates that the variable has been
implicitly typed, rather than being named in an explicit type
declaration statement. The table also lists all subprograms invoked
by the module, all COMMON blocks declared, etc. Default = no.
Also, for each module, a label table will be printed. The table
lists each label defined in the module; the line on which said
statement label is defined; and the statement type (executable,
format, or specification). The labels are listed in sequential
order.
Also printed is a table describing the I/O units used by the
module, together with information about how they are used: what
operations are performed, whether the access is sequential or
direct, and whether the I/O is formatted or unformatted.
See also: -calltree, -crossref, -list,
-reference, -sort, -vcg.
- -truncation=list
-
- Warn about possible truncation (or roundoff) errors. Most of
these are related to integer arithmetic. By default, all warnings
are turned on.
This setting provides detailed control over the warnings about
possible truncation errors. The list consists of keywords
separated by commas or colons. Since all warnings are on by
default, include a keyword prefixed by no- to turn off a
particular warning. There are three special keywords: all to
turn on all the warnings about truncation, none to turn them
all off, and help to print the list of all the keywords with
a brief explanation of each. If list is omitted,
-truncation is equivalent to -truncation=all, and
-notruncation is equivalent to -truncation=none. The
warning keywords with their meanings are as follows:
- int-div-exponent:
- use of the result of integer division as an exponent. This
suggests that a real quotient is intended. An example would be
writing X**(1/3) to evaluate the cube root of X. The correct
expression is X**(1./3.).
- int-div-real:
- Conversion of an expression involving an integer division to
real. This suggests that a real quotient is intended.
- int-div-zero:
- division in an integer constant expression that yields a result
of zero.
- int-neg-power:
- exponentiation of an integer by a negative integer (which
yields zero unless the base integer is 1 in magnitude). This
suggests that a real base is intended.
- promotion:
- automatic conversion of a lower precision quantity to one of
higher precision. The loss of accuracy for real variables in this
process is comparable to the corresponding demotion. No warning is
given for promotion of integer quantities to real since this is
ordinarily exact.
- real-do-index:
- use of a non-integer DO index in a loop with integer bounds. An
integer DO index with real bounds is always warned about regardless
of this setting.
- real-subscript:
- use of a non-integer array subscript.
- significant-figures:
- overspecifying a single precision constant. This may indicate
that a double precision constant was intended.
- size-demotion:
- automatic conversion of a higher precision quantity to one of
lower precision of the same type. This warning only occurs when an
explicit size is used in declaring the type of one or both operands
in an assignment. For example, a warning wil be issued where a
REAL*8 variable is assigned to a REAL variable, if the default
wordsize of 4 is in effect. A warning is also issued if a long
integer is assigned to a shorter one, for example, if an INTEGER
expression is assigned to an INTEGER*2 variable. There is one
exception to this last case, namely if the right hand side of the
assignment is a small literal constant (less than 128).
type-demotion: automatic conversion of a higher precision
quantity to one of lower precision of different type. This warning
includes conversion of real quantities to integer, double precision
to single precision real, and assignment of a longer character
string to a shorter one.
The warnings about promotion and demotion also apply to complex
constants, considering the precision to be that of the real or
imaginary part. Warnings about promotions and demotions are given
only when the conversion is done automatically, e.g. in expressions
of mixed precision or in an assignment statement. If intrinsic
functions such as INT are used to perform the conversion, no
warning is given.
See also: -portability, -wordsize.
- -usage=list
-
- Warn about unused or possible uninitialized variables, unused
common blocks, undefined or unused statement labels, and unused or
undefined subprograms. By default, all warnings are turned on.
This setting provides detailed control over the warnings about
possible usage errors. The list consists of keywords
separated by commas or colons. Since all warnings are on by
default, include a keyword prefixed by no- to turn off a
particular warning. There are three special keywords: all to
turn on all the warnings about usage, none to turn them all
off, and help to print the list of all the keywords with a
brief explanation of each. If list is omitted, -usage
is equivalent to -usage=all, and -nousage is
equivalent to -usage=none. These warnings cover four main
categories of objects: subprogram dummy arguments, common blocks
and variables, subprograms and functions, and local variables.
Warnings include undefined items, multiply defined items, unused
items, etc. The warning keywords with their meanings are as
follows:
- arg-alias:
- a scalar dummy argument is actually the same as another and is
(or may be) modified. The Fortran 77 standard (section 15.9.3.6)
prohibits modifying an argument that is aliased to another.
- arg-array-alias:
- a dummy argument which is an array or array element is in the
same array as another and is modified. This flag is similar to
arg-alias but provides separate control over array
arguments. It is harder to tell if aliasing is occurring in the
case of arrays, so if ftnchek gives too many false warnings,
this flag allows the array-related ones to be turned off without
suppressing the warnings for scalars.
- arg-common-alias:
- a scalar dummy argument is the same as a common variable in the
subprogram, and either is modified. This is also prohibited by the
Fortran 77 standard. If common checking is not exact (see the
-common setting), it is harder to tell if aliasing is
occurring, so the warning is given if the variable is anywhere in a
common block that is declared by the subprogram.
- arg-common-array-alias:
- a dummy argument which is an array or array element is in the
same array as a common variable, and either is modified. If common
checking is not exact, the variable can be anywhere in a common
block that is declared by the subprogram.
- arg-const-modified:
- a subprogram modifies an argument which is a constant or an
expression. Such an action could cause anomalous behavior of the
program.
- arg-unused:
- a dummy argument is declared but never used. This is similar to
the var-unused keyword described below, but applies only to
arguments.
- com-block-unused:
- a common block is declared but none of the variables in it are
used by any subprogram. This warning is suppressed if the common
strictness setting is 0.
- com-block-volatile:
- a common block may lose the definition of its contents if
common blocks are volatile. This option only has an effect if the
-common=volatile flag is in effect. See the discussion of
the -common setting above.
- com-var-set-unused:
- a common variable is assigned a value, but its value is not
used by any subprogram. This warning is suppressed if the common
strictness setting is 0.
- com-var-uninitialized:
- a common variable's value is used in some subprogram, but is
not set anywhere. Unfortunately, ftnchek does not do a
thorough enough analysis of the calling sequence to know which
routines are called before others. So warnings about this type of
error will only be given for cases in which a variable is used in
some routine but not set in any other routine. Checking of
individual COMMON variables is done only if the -common
setting is 3 (variable by variable agreement). This warning is
suppressed if the common strictness setting is 0.
- com-var-unused:
- a common variable is declared but not used by any subprogram.
This warning is suppressed if the common strictness setting is 0.
- do-index-modified:
- a variable that is the index of a DO loop is modified by some
statement within the range of the loop. The Standard permits an
active DO variable to be modified only by the incrementation
mechanism of the DO statement.
- ext-multiply-defined:
- an external (a subroutine or function) is defined more than
once. Definition of an external means providing the body of its
source code.
- ext-declared-only:
- a name is declared in an EXTERNAL statement in some module, but
is not defined or used anywhere.
- ext-undefined:
- an external is used (invoked) but not defined anywhere. This
option is equivalent to the -external flag. If the
subprogram is invoked more than once, those invocations will still
be checked for consistency.
- ext-unused:
- an external is defined (its subprogram body is present) but it
is not used. A subprogram is considered unused even if it is
invoked by some other subprogram, if it cannot be called from any
thread of execution starting with the main program. The agreement
of the subprogram's arguments with its invocations is still checked
even if this warning is turned off. If there is no main program,
then this warning is issued only if the subprogram is not invoked
anywhere. This warning is suppressed in library mode, but library
mode has the additional effect of suppressing argument checking for
unused routines.
- label-undefined:
- a statement refers to a label that has not been defined.
- label-unused:
- a statement label is defined, but never referred to.
- var-set-unused:
- a local variable is assigned a value, but that value is not
used.
- var-uninitialized:
- a local variable's value may be used before it is assigned.
Sometimes ftnchek makes a mistake in the warnings about
local variable usage. Usually it errs on the side of giving a
warning where no problem exists, but in rare cases it may fail to
warn where the problem does exist. See the section on Bugs for
examples. If variables are equivalenced, the rule used by
ftnchek is that a reference to any variable implies the same
reference to all variables it is equivalenced to. For arrays, the
rule is that a reference to any array element is treated as a
reference to all elements of the array.
- var-unused:
- a local variable is declared (for instance, in a type
declaration) but is not used in the module. Does not apply to dummy
arguments: warnings about them are controlled by the keyword
arg-unused described above.
Note: In versions of ftnchek prior to 2.10, the
-usage flag took a numeric argument instead of a list of
options. For the sake of users who may have written scripts
invoking ftnchek in this way, the numeric form is still
accepted. The numeric setting is composed of three digits. The
first digit (hundreds place) controls warnings about subprograms
(functions and subroutines), the second digit (tens place) warnings
about common blocks and common variables,, and the third digit
(ones place) warnings about local variables. Each digit controls
warnings according to the convention that a 1 means warn about
undefined items and variables that are used before set, a 2 means
warn about items that are unused, and a 3 means warn about both
types. These numbers are now converted to the appropriate values
for the above-listed keywords, except for
com-block-volatile, which is not affected by the numeric
argument.
See also: -common, -declare, -extern,
-library.
- -vcg
-
- Produce the call graph in the form of a VCG graph description.
This description is written to a separate file, with the same stem
as the file containing the main program, and suffix .vcg.
This file is able to be given directly to xvcg(1L) to
visualize the call graph. (If input is from the standard input,
then the graph description is sent to standard output.) This switch
is equivalent to -calltree=vcg. Default = no.
The VCG description as created is more complex than it need be.
VCG allows graphs and nested subgraphs: each subroutine is created
as a subgraph nested inside its calling routines. This allows you
to interactively display subgraphs or summarise them.
The -vcg option for ftnchek was written by Dr.
Philip Rubini of Cranfield University, UK.
xvcg is a graph visualisation tool which runs under the X
windows system. It is freely available from ftp.cs.uni-sb.de. It was written by G.
Sander of the University of Saarland, Germany.
See also: -calltree, -crossref, -reference,
-sort.
- -version
-
- This option causes ftnchek to print a line giving the
version number, release date, and patch level of the program. If no
files are given, it then exits. If files are given, the effect of
this option is to include the patch level (normally omitted) in the
version information printed at the start of processing. Default =
no.
See also: -help.
- -volatile
-
- Assume that COMMON blocks are volatile. Default = no.
This flag is superseded by -common=volatile, and should
no longer be used. It may be eliminated in a future release of
ftnchek.
See also: -common, -usage.
- -wordsize=num
-
- Specifies the default word size to be num bytes. This is
the size of logical and single-precision numeric variables that are
not given explicit precisions. (Explicit precisions for
non-character variables are an extension to the Fortran 77
Standard, and are given by type declarations such as REAL*8 X.)
Double-precision and complex variables will be twice this value,
and double complex variables four times. Quad-precision constants
and intrinsic function results will be four times this value. Note
that variables declared as REAL*16 will be regarded as quad
precision only if the word size is 4 bytes. Default = turn-on = 4
bytes.
The word size value does not matter for checking
standard-conforming programs that do not declare explicit
precisions for non-character variables or store Hollerith data in
variables. This setting also does not affect the default size of
character variables, which is always 1 byte. Hollerith constants
also are assumed to occupy 1 byte per character.
The word size is used to determine whether truncation occurs in
assignment statements, and to catch precision mismatches in
subprogram argument lists and common block lists. The exact
warnings that are issued will depend on the status of other flags.
Under both the -portability=mixed-size and the
-nowordsize flag, any mixing of explicit with default
precision objects (character expressions not included) is warned
about. This applies to arithmetic expressions containing both types
of objects, and to subprogram arguments and COMMON variables. Under
control of the -truncation=demotion and promotion
options, a warning is given for assignment of an expression to a
shorter variable of the same type, or for promotion of a lower
precision value to higher precision in an arithmetic expression or
an assignment statement.
Giving a word size of 0, or equivalently, using
-nowordsize means that no default value will be assumed.
This is equivalent to specifying -portability=mixed-size.
Use it to find cases of mixing default and explicit precision, for
example to flag places where REAL*8 is treated as equivalent to
DOUBLE PRECISION.
See also: -pointersize, -portability,
-truncation.
- -wrap=col
- Controls the wrapping of error messages. Long error messages
that would run past the specified column will be broken up into
separate lines between the words of the message for better
readability. If turned off with -nowrap, each separate error
message will be printed on one line, leaving it up to the display
to wrap the message or truncate it. Default = turn-on =
79.
CHANGING THE DEFAULTS
ftnchek includes two
mechanisms for changing the default values of all options: by
defining environment variables or by creating a preferences file.
When ftnchek starts up, it looks in its environment for any
variables whose names are composed by prefixing the string FTNCHEK_
onto the uppercased version of the option name. If such a variable
is found, its value is used to specify the default for the
corresponding switch or setting. In the case of settings (for
example, the -common strictness setting) the value of the
environment variable is read as the default setting value. In the
case of switches, the default switch will be taken as true or yes
unless the environment variable has the value 0 or NO.
Note that the environment variable name must be constructed with
the full-length option name, which must be in uppercase. For
example, to make ftnchek print a source listing by default,
set the environment variable FTNCHEK_LIST to 1 or YES or anything
other than 0 or NO. The names FTNCHEK_LIS (not the full option
name) or ftnchek_list (lower case) would not be recognized.
Here are some examples of how to set environment variables on
various systems. For simplicity, all the examples set the default
-list switch to YES.
>1. UNIX, Bourne shell: >$ FTNCHEK_LIST=YES
> >$ export FTNCHEK_LIST
>2. UNIX, C shell: >% setenv FTNCHEK_LIST YES
>3. VAX/VMS: >$ DEFINE FTNCHEK_LIST YES
>4. MSDOS: >$ SET FTNCHEK_LIST=YES
After processing any environment variables, ftnchek looks for a
preferences file containing options and settings. It will search in
the following order, using only the first file found: (1)
.ftnchekrc in the current directory, (2) ftnchek.ini
in the current directory, (3) .ftnchekrc in the user's home
directory, (4) ftnchek.ini in the home directory. If such a
file is found, the options defined in it are used as defaults in
place of the built-in defaults and overriding any defaults set in
the environment..
Each option or setting in the preferences file must be on a
separate line. They are given in the same form as on the command
line, except without the initial dash. The preferences file can
contain blank lines and comments. Comments are introduced at any
point in a line by a space character (blank or tab) or the '#'
character, and are terminated by the end of the line.
Command-line options override the defaults set in the
environment or in the preferences file, in the same way as they
override the built-in defaults.
USING PROJECT FILES
This section contains detailed
information on how to use project files most effectively, and how
to avoid some pitfalls.
One can divide the checks ftnchek does into two
categories, local and global. Local checking is restricted to
within a single routine, and catches things like uninitialized
variables, unintended loss of precision in arithmetic expressions,
etc. This sort of checking can be done on each subprogram
independently. Furthermore, local checking of a subprogram does not
need to be repeated when some other subprogram is changed. Global
checking catches things like calling a subroutine with the wrong
argument types, or disagreeing in common block declarations. It
requires looking at the whole set of subprograms interacting with
each other.
The purpose of project files is to allow the local checking and
global checking steps to be separated. Assuming that each
subprogram is in its own source file, you can run ftnchek
once on each one to do local checking while suppressing global
checking. Then ftnchek can be run once on all the project
files together to do the global checking. The sample makefile below
shows how to automate this task. The ``.f.prj'' target updates a
project file for a particular file any time the source file
changes. The information needed for global checking is saved in the
project file. The ``check'' target does the combined global
checking. Typically ``make check'' would repeat the ``ftnchek
-project'' step only on changed source files, then do the global
check. This is obviously a big advantage for large programs, when
many subprograms seldom if ever change.
It is best when using project files to place each subprogram in
a separate source file. If each source file may contain more than
one subprogram, it complicates the definition of ``local'' and
``global'' checking because there is some inter-module checking
that is contained within a file. ftnchek tries to do the
right thing in this case, but there are some complications
(described below) due to the trade-off between avoiding re-doing
cross-checks and preserving information about the program's
structure.
Ordinarily, to do the least amount of re-checking, project files
should be created with the -library flag in effect and
trimming turned on. In this mode, the information saved in the
project file consists of all subprogram declarations, all
subprogram invocations not resolved by declarations in the same
file, and one instance of each COMMON block declaration. This is
the minimum amount of information needed to check agreement between
files.
If the source file contains more than one routine, there are
some possible problems that can arise from creating the project
file in library mode, because the calling hierarchy among routines
defined within the file is lost. Also, if the routines in the file
make use of COMMON blocks that are shared with routines in other
files, there will not be enough information saved for the correct
checking of set and used status of COMMON blocks and COMMON
variables according to the -usage setting. Therefore if you
plan to use project files when -usage checking is turned on
(which is the default situation), and if multiple routines in one
project file share COMMON blocks with routines in other files, the
project files should be created with the -library flag
turned off. In this mode, ftnchek saves, besides the
information listed above, one invocation of each subprogram by any
other subprogram in the same file, and all COMMON block
declarations. This means that the project file will be larger than
necessary, and that when it is read in, ftnchek may repeat
some inter-module checks that it already did when the project file
was created. If each project file contains only one module, there
is no loss of information in creating the project files in library
mode.
Because of the possible loss of information entailed by creating
a project file with the -library flag in effect, whenever
that project file is read in later, it will be treated as a library
file regardless of the current setting of the -library flag.
On the other hand, a project file created with library mode turned
off can be read in later in either mode.
The foregoing discussion assumes that the trimming options of
the -project setting are turned on when the project file is
created. This is the normal situation. The no-trim options
of the -project setting are provided in case one wants to
use the project files for purposes other than checking the program
with ftnchek. For instance, one could write a Perl script to
analyze the project files for information about how the different
subprograms are called. You should not use the no-trim
options to deal with the issues of information loss discussed
above, since they cause more information than necessary to be
stored. This makes the project files bigger and causes
ftnchek to do more work later when it reads them to check
your complete program. Ordinarily, you should use the
-library option to control how much information to store for
later use by ftnchek in checking your program.
Here is an example of how to use the UNIX make utility to
automatically create a new project file each time the corresponding
source file is altered, and to check the set of files for
consistency. Add these lines to your makefile. The example assumes
that a macro OBJS has been defined which lists all the names of
object files to be linked together to form the complete executable
program. (In this makefile, the indented lines should each begin
with a tab, not blanks.) If any source file contains multiple
routines that share common blocks among themselves, then the
no-com-\* option should be removed from NOGLOBAL, and/or drop the
-library flag.
# tell make what a project file suffix is
.SUFFIXES: .prj
# these options suppress global checks.
NOGLOBAL=-usage=no-ext-undefined,no-com-\*
# tell make how to create a .prj file from a .f file
.f.prj:
ftnchek -project $(NOGLOBAL) -library $<
# set up macro PRJS containing project filenames
PRJS= $(OBJS:.o=.prj)
# "make check" will check everything that has been changed.
check: $(PRJS)
ftnchek $(PRJS)
When a program uses many routines defined in a large number of
different source files in different directories, it can be
cumbersome to specify all the different project files needed to
check the program properly. To deal with such cases, ftnchek
allows project files to be concatenated into a single large file.
This single file can then be given to ftnchek to provide the
information for checking the use of any or all of the routines
defined in the combined project files. When using such a
``library'' project file, you may want ftnchek's error
reports to document precisely the name of the file where the
specific function is defined. If the various source files are in
several directories, an error report that gives only the file name
may be ambiguous, and rather should include the path to the file.
The solution is to create each of the individual project files by
giving the complete path to the source file. Then this complete
path will appear in the error reports. For example, suppose that
all of the library subprogram source files are in subdirectories of
a directory named /util/lib. Then the individual project files
could first be created by a command such as
find /util/lib -name '*.f' -exec ftnchek -project '{}' ';'
(Possibly other options would be provided to ftnchek as
discussed above. Also, this step could be handled instead by a
revised makefile rule that would provide the complete source file
path instead of just the local name when invoking ftnchek.)
Next, concatenate all of these project files manually.
find /util/lib -name '*.prj' -exec cat '{}' ';' > ourlib.prj
Then a program source file can be checked by using the command
ftnchek prog.f ... -lib ourlib.prj
and an error message related to any library routine will include
the full path to the routine's source file.
At present, there is no archive utility like ar to manage
the contents of a concatenated project file like the one in the
illustration above. If changes are made to one of the library
routines, the only way to update the combined project file is to
concatenate all the individual project files once again. Such a
utility would be quite easy to write. Someone should do so and
contribute it to the ftnchek effort.
AN EXAMPLE
The following simple Fortran program illustrates
the messages given by ftnchek. The program is intended to
accept an array of test scores and then compute the average for the
series.
C AUTHORS: MIKE MYERS AND LUCIA SPAGNUOLO
C DATE: MAY 8, 1989
C Variables:
C SCORE -> an array of test scores
C SUM -> sum of the test scores
C COUNT -> counter of scores read in
C I -> loop counter
REAL FUNCTION COMPAV(SCORE,COUNT)
INTEGER SUM,COUNT,J,SCORE(5)
DO 30 I = 1,COUNT
SUM = SUM + SCORE(I)
30 CONTINUE
COMPAV = SUM/COUNT
END
PROGRAM AVENUM
C
C MAIN PROGRAM
C
C AUTHOR: LOIS BIGBIE
C DATE: MAY 15, 1990
C
C Variables:
C MAXNOS -> maximum number of input values
C NUMS -> an array of numbers
C COUNT -> exact number of input values
C AVG -> average returned by COMPAV
C I -> loop counter
C
PARAMETER(MAXNOS=5)
INTEGER I, COUNT
REAL NUMS(MAXNOS), AVG
COUNT = 0
DO 80 I = 1,MAXNOS
READ (5,*,END=100) NUMS(I)
COUNT = COUNT + 1
80 CONTINUE
100 AVG = COMPAV(NUMS, COUNT)
END
The compiler gives no error messages when this program is
compiled. Yet here is what happens when it is run:
$ run average
70
90
85
<EOF>
$
What happened? Why didn't the program do anything? The following
is the output from ftnchek when it is used to debug the
above program:
$ ftnchek -list -symtab average
FTNCHEK Version 3.3 November 2004
File average.f:
1 C AUTHORS: MIKE MYERS AND LUCIA SPAGNUOLO
2 C DATE: MAY 8, 1989
3
4 C Variables:
5 C SCORE -> an array of test scores
6 C SUM -> sum of the test scores
7 C COUNT -> counter of scores read in
8 C I -> loop counter
9
10 REAL FUNCTION COMPAV(SCORE,COUNT)
11 INTEGER SUM,COUNT,J,SCORE(5)
12
13 DO 30 I = 1,COUNT
14 SUM = SUM + SCORE(I)
15 30 CONTINUE
16 COMPAV = SUM/COUNT
^
Warning near line 16 col 20: integer quotient expr SUM/COUNT converted to
real
17 END
Module COMPAV: func: real
Variables:
Name Type Dims Name Type Dims Name Type Dims Name Type Dims
COMPAV real COUNT intg I intg* J intg
SCORE intg 1 SUM intg
* Variable not declared. Type has been implicitly defined.
Warning in module COMPAV: Variables declared but never referenced:
J declared at line 11
Warning in module COMPAV: Variables may be used before set:
SUM used at line 14
SUM set at line 14
Statement labels defined:
Label Line StmtType
<30> 15 exec
18
19
20 PROGRAM AVENUM
21 C
22 C MAIN PROGRAM
23 C
24 C AUTHOR: LOIS BIGBIE
25 C DATE: MAY 15, 1990
26 C
27 C Variables:
28 C MAXNOS -> maximum number of input values
29 C NUMS -> an array of numbers
30 C COUNT -> exact number of input values
31 C AVG -> average returned by COMPAV
32 C I -> loop counter
33 C
34
35 PARAMETER(MAXNOS=5)
36 INTEGER I, COUNT
37 REAL NUMS(MAXNOS), AVG
38 COUNT = 0
39 DO 80 I = 1,MAXNOS
40 READ (5,*,END=100) NUMS(I)
41 COUNT = COUNT + 1
42 80 CONTINUE
43 100 AVG = COMPAV(NUMS, COUNT)
44 END
Module AVENUM: prog
External subprograms referenced:
COMPAV: real*
Variables:
Name Type Dims Name Type Dims Name Type Dims Name Type Dims
AVG real COUNT intg I intg MAXNOS intg*
NUMS real 1
* Variable not declared. Type has been implicitly defined.
Warning in module AVENUM: Variables set but never used:
AVG set at line 43
I/O Operations:
Unit ID Unit No. Access Form Operation Line
5 SEQ FMTD READ 40
Statement labels defined:
Label Line StmtType Label Line StmtType
<80> 42 exec <100> 43 exec
0 syntax errors detected in file average.f
6 warnings issued in file average.f
Warning: Subprogram COMPAV argument data type mismatch at position 1:
Dummy arg SCORE in module COMPAV line 10 file average.f is type intg
Actual arg NUMS in module AVENUM line 43 file average.f is type real
According to ftnchek, the program contains variables
which may be used before they are assigned an initial value, and
variables which are not needed. ftnchek also warns the user
that an integer quotient has been converted to a real. This may
assist the user in catching an unintended roundoff error. Since the
-symtab flag was given, ftnchek prints out a table
containing identifiers from the local module and their
corresponding datatype and number of dimensions. Finally,
ftnchek warns that the function COMPAV is not used with the
proper type of arguments.
With ftnchek's help, we can debug the program. We can see
that there were the following errors:
- 1.
- SUM and COUNT should have been converted to real before doing
the division.
- 2.
- SUM should have been initialized to 0 before entering the loop.
- 3.
- AVG was never printed out after being calculated.
- 4.
- NUMS should have been declared INTEGER instead of REAL.
We also see that I, not J, should have been declared INTEGER in
function COMPAV. Also, MAXNOS was not declared as INTEGER, nor
COMPAV as REAL, in program AVENUM. These are not errors, but they
may indicate carelessness. As it happened, the default type of
these variables coincided with the intended type.
Here is the corrected program, and its output when run:
C AUTHORS: MIKE MYERS AND LUCIA SPAGNUOLO
C DATE: MAY 8, 1989
C
C Variables:
C SCORE -> an array of test scores
C SUM -> sum of the test scores
C COUNT -> counter of scores read in
C I -> loop counter
C
REAL FUNCTION COMPAV(SCORE,COUNT)
INTEGER SUM,COUNT,I,SCORE(5)
C
SUM = 0
DO 30 I = 1,COUNT
SUM = SUM + SCORE(I)
30 CONTINUE
COMPAV = FLOAT(SUM)/FLOAT(COUNT)
END
C
C
PROGRAM AVENUM
C
C MAIN PROGRAM
C
C AUTHOR: LOIS BIGBIE
C DATE: MAY 15, 1990
C
C Variables:
C MAXNOS -> maximum number of input values
C NUMS -> an array of numbers
C COUNT -> exact number of input values
C AVG -> average returned by COMPAV
C I -> loop counter
C
C
INTEGER MAXNOS
PARAMETER(MAXNOS=5)
INTEGER I, NUMS(MAXNOS), COUNT
REAL AVG,COMPAV
COUNT = 0
DO 80 I = 1,MAXNOS
READ (5,*,END=100) NUMS(I)
COUNT = COUNT + 1
80 CONTINUE
100 AVG = COMPAV(NUMS, COUNT)
WRITE(6,*) 'AVERAGE =',AVG
END
$ run average
70
90
85
<EOF>
AVERAGE = 81.66666
$
With ftnchek's help, our program is a success!
INTERPRETING THE OUTPUT
The messages given by
ftnchek include not only syntax errors but also warnings and
informational messages about things that are legal Fortran but that
may indicate errors or carelessness. Most of these messages can be
turned off by command-line options. Which option controls each
message depends on the nature of the condition being warned about.
See the descriptions of the command-line flags in the previous
sections, and of individual messages below. Each message is
prefixed with a word or phrase indicating the nature of the
condition and its severity.
``Error'' means a syntax error. The simplest kind of syntax
errors are typographical errors, for example unbalanced parentheses
or misspelling of a keyword. This type of error is caught by the
parser and appears with the description ``parse error'' or ``syntax
error'' (depending on the version of the parser generator and
whether it is GNU bison or UNIX yacc). This type of
error message cannot be suppressed. Be aware that this type of
error often means that ftnchek has not properly interpreted
the statement where the error occurs, so that its subsequent
checking operations will be compromised. You should eliminate all
syntax errors before proceeding to interpret the other messages
ftnchek gives.
``Warning: Nonstandard syntax'' indicates an extension to
Fortran that ftnchek supports but that is not according to
the Fortran 77 Standard. The extensions that ftnchek accepts
are described in the section on Extensions below. One example is
the DO ... ENDDO construction. If a program uses these extensions,
warnings will be given according to specifications under the
-f77 setting. The default behavior is to give no warnings.
``Warning'' in other cases means a condition that is suspicious
but that may or may not be a programming error. Frequently these
conditions are legal under the standard. Some are illegal but do
not fall under the heading of syntax errors. Usage errors are one
example. These refer to the possibility that a variable may be used
before it has been assigned a value (generally an error), or that a
variable is declared but never used (harmless but may indicate
carelessness). The amount of checking for usage errors is
controlled by the -usage flag, which specifies the maximum
amount of checking by default.
Truncation warnings cover situations in which accuracy may be
lost unintentionally, for example when a double precision value is
assigned to a real variable. These warnings are controlled by the
-truncation setting, which is on by default.
``Nonportable usage'' warns about some feature that may not be
accepted by some compilers even though it is not contrary to the
Fortran 77 Standard, or that may cause the program to perform
differently on different platforms. For example, equivalencing real
and integer variables is usually a non-portable practice. The use
of extensions to the standard language is, of course, another
source of non-portability, but this is handled as a separate case.
To check a program for true portability, both the
-portability and the -f77 flags should be used. They
are both turned off by default. The -wordsize setting is
provided to check only those nonportable usages that depend on a
particular machine wordsize.
``Possibly misleading appearance'' is used for legal
constructions that may not mean what they appear to mean at first
glance. For example, Fortran is insensitive to blank space, so
extraneous space within variable names or the lack of space between
a keyword and a variable can convey the wrong impression to the
reader. These messages can be suppressed by turning off the
-pretty flag, which is on by default.
Other messages that are given after all the files are processed,
and having to do with agreement between modules, do not use the
word ``warning'' but generally fall into that category. Examples
include type mismatches between corresponding variables in
different COMMON block declarations, or between dummy and actual
arguments of a subprogram. These warnings are controlled by the
-common and -arguments settings respectively. By
default both are set for maximum strictness of checking.
Another group of warnings about conditions that are often
harmless refer to cases where the array properties of a variable
passed as a subprogram argument differ between the two routines.
For instance, an array element might be passed to a subroutine that
expects a whole array. This is a commonly-used technique for
processing single rows or columns of two-dimensional arrays.
However, it could also indicate a programming error. The
-array setting allows the user to adjust the degree of
strictness to be used in checking this kind of agreement between
actual and dummy array arguments. By default the strictness is
maximum.
``Oops'' indicates a technical problem, meaning either a bug in
ftnchek or that its resources have been exceeded.
The syntax error messages and warnings include the filename
along with the line number and column number. ftnchek has
two different options for the appearance of these error messages.
If -novice is in effect, which is the default, the messages
are in a style approximating normal English. (In default style, the
filename is not printed in messages within the body of the program
if -list is in effect.) The other style of error messages is
selected by the -nonovice option. In this style, the
appearance of the messages is similar to that of the UNIX
lint program.
ftnchek is still blind to some kinds of syntax errors.
The two most important ones are detailed checking of FORMAT
statements, and almost anything to do with control of execution
flow by means of IF, DO, and GOTO statements: namely correct
nesting of control structures, matching of opening statements such
as IF ... THEN with closing statements such as ENDIF, and the
proper use of statement labels (numbers). Most compilers will catch
these errors. See the section on Limitations for a more detailed
discussion.
If ftnchek gives you a syntax error message when the
compiler does not, it may be because your program contains an
extension to standard Fortran which is accepted by the compiler but
not by ftnchek. (See the section on Extensions.) On a
VAX/VMS system, you can use the compiler option /STANDARD to cause
the compiler to accept only standard Fortran. On most UNIX or
UNIX-like systems, this can be accomplished by setting the flag
-ansi.
Many of the messages given by ftnchek are
self-explanatory. Those that need some additional explanation are
listed below in alphabetical order.
- Common block NAME: data type mismatch at position n
- The n-th variable in the COMMON block differs in data
type in two different declarations of the COMMON block. By default
(-common strictness level 3), ftnchek is very picky
about COMMON blocks: the variables listed in them must match
exactly by data type and array dimensions. That is, the legal pair
of declarations in different modules:
COMMON /COM1/ A,B
and
COMMON /COM1/ A(2)
will cause ftnchek to give warnings at strictness level 3.
These two declarations are legal in Fortran since they both declare
two real variables. At strictness level 1 or 2, no warning would be
given in this example, but the warning would be given if there were
a data type mismatch, for instance, if B were declared INTEGER.
Controlled by -common setting.
- Common block NAME has long data type following short data
type
- Some compilers require alignment of multi-byte items so that
each item begins at an address that is a multiple of the item size.
Thus if a short (e.g. single-precision real) item is followed by a
long (e.g. double precision real) item, the latter may not be
aligned correctly. Controlled by
-portability=common-alignment option.
- Common block NAME has mixed character and non-character
variables
- The ANSI standard requires that if any variable in a COMMON
block is of type CHARACTER, then all other variables in the same
COMMON block must also be of type CHARACTER. Controlled by
-f77=mixed-common option.
- Common block NAME: varying length
- For -common setting level 2, this message means that a
COMMON block is declared to have different numbers of words in two
different subprograms. A word is the amount of storage occupied by
one integer or real variable. For -common setting level 3,
it means that the two declarations have different numbers of
variables, where an array of any size is considered one variable.
This is not necessarily an error, but it may indicate that a
variable is missing from one of the lists. Note that according to
the Fortran 77 Standard, it is an error for named COMMON blocks
(but not blank COMMON) to differ in number of words in declarations
in different modules. Given for -common setting 2 or 3.
- Error: Badly formed logical/relational operator or
constant
- Error: Badly formed real constant
- The syntax analyzer has found the start of one of the special
words that begin and end with a period (e.g. .EQ.), or the start of
a numeric constant, but did not succeed in finding a complete item
of that kind.
- Error: cannot be adjustable size in module NAME
- A character variable cannot be declared with a size that is an
asterisk in parentheses unless it is a dummy argument, a parameter,
or the name of the function defined in the module.
- Error: cannot be declared in SAVE statement in module
NAME
- Only local variables and common blocks can be declared in a
SAVE statement.
- Error: No path to this statement
- ftnchek will detect statements which are ignored or
by-passed because there is no foreseeable route to the statement.
For example, an unnumbered statement (a statement without a
statement label), occurring immediately after a GOTO statement,
cannot possibly be executed.
- Error: Parse error
- This means that the parser, which analyzes the Fortran program
into expressions, statements, etc., has been unable to find a valid
interpretation for some portion of a statement in the program. If
your compiler does not report a syntax error at the same place, the
most common explanations are: (1) use of an extension to ANSI
standard Fortran that is not recognized by ftnchek, or (2)
the statement requires more lookahead than ftnchek uses (see
section on Bugs).
- NOTE: This message means that the affected statement is not
interpreted. Therefore, it is possible that ftnchek's
subsequent processing will be in error, if it depends on any
matters affected by this statement (type declarations, etc.).
- Error: Syntax error
- This is the same as ``Error: Parse error'' (see above). It is
generated if your version of ftnchek was built using the
UNIX yacc parser generator rather than GNU bison.
- Identifiers which are not unique in first six chars
- Warns that two identifiers which are longer than 6 characters
do not differ in the first 6 characters. This is for portability:
they may not be considered distinct by some compilers. Controlled
by -sixchar option.
- Nonportable usage: argument precision may not be correct for
intrinsic function
- The precision of an argument passed to an intrinsic function
may be incorrect on some computers. Issued when a numeric variable
declared with explicit precision (e.g. REAL*8 X) is passed to a
specific intrinsic function (e.g. DSQRT(X)). Controlled by
-portability=mixed-size and -wordsize.
- Nonportable usage: character constant/variable length
exceeds 255
- Some compilers do not support character strings more than 255
characters in length. Controlled by
-portability=long-string.
- Nonportable usage: File contains tabs
- ftnchek expands tabs to be equivalent to spaces up to
the next column which is a multiple of 8. Some compilers treat tabs
differently, and also it is possible that files sent by electronic
mail will have the tabs converted to blanks in some way. Therefore
files containing tabs may not be compiled correctly after being
transferred. ftnchek does not give this message if tabs only
occur within comments or character constants. Controlled by
-portability=tab.
- Nonportable usage: non-integer DO loop bounds
- This warning is only given when the DO index and bounds are
non-integer. Use of non-integer quantities in a DO statement may
cause unexpected errors, or different results on different
machines, due to roundoff effects. Controlled by
-portability=real-do.
- Possibly it is an array which was not declared
- This message is appended to warnings related to a function
invocation or to an argument type mismatch, for which the
possibility exists that what appears to be a function is actually
meant to be an array. If the programmer forgot to dimension an
array, references to the array will be interpreted as function
invocations. This message will be suppressed if the name in
question appears in an EXTERNAL or INTRINSIC statement. Controlled
by the -novice option.
- Possibly misleading appearance: characters past 72
columns
- The program is being processed with the statement field width
at its standard value of 72, and some nonblank characters have been
found past column 72. In this case, ftnchek is not
processing the characters past column 72, and is notifying the user
that the statement may not have the meaning that it appears to
have. These characters might be intended by the programmer to be
significant, but they will be ignored by the compiler. Controlled
by -pretty=long-line.
- Possibly misleading appearance: Common block declared in
more than one statement
- Such multiple declarations are legal and have the same effect
as a continuation of the original declaration of the block. This
warning is only given if the two declarations are separated by one
or more intervening statements. Controlled by
-pretty=multiple-common.
- Possibly misleading appearance: Continuation follows comment
or blank line
- ftnchek issues this warning message to alert the user
that a continuation of a statement is interspersed with comments,
making it easy to overlook. Controlled by
-pretty=continuation.
- Possibly misleading appearance: Extraneous parentheses
- Warns about parentheses surrounding a variable by itself in an
expression. When a parenthesized variable is passed as an argument
to a subprogram, it is treated as an expression, not as a variable
whose value can be modified by the called routine. Controlled by
-pretty=parentheses.
- Subprogram NAME: argument data type mismatch at position
n
- The subprogram's n-th actual argument (in the CALL or
the usage of a function) differs in datatype or precision from the
n-th dummy argument (in the SUBROUTINE or FUNCTION
declaration). For instance, if the user defines a subprogram by
SUBROUTINE SUBA(X)
REAL X
and elsewhere invokes SUBA by
CALL SUBA(2)
ftnchek will detect the error. The reason here is that the
number 2 is integer, not real. The user should have written
CALL SUBA(2.0)
- When checking an argument which is a subprogram, ftnchek
must be able to determine whether it is a function or a subroutine.
The rules used by ftnchek to do this are as follows: If the
subprogram, besides being passed as an actual argument, is also
invoked directly elsewhere in the same module, then its type is
determined by that usage. If not, then if the name of the
subprogram does not appear in an explicit type declaration, it is
assumed to be a subroutine; if it is explicitly typed it is taken
as a function. Therefore, subroutines passed as actual arguments
need only be declared by an EXTERNAL statement in the calling
module, whereas functions must also be explicitly typed in order to
avoid generating this error message. Controlled by
-arguments setting.
- Subprogram NAME: argument arrayness mismatch at position
n
- Similar to the preceding situation, but the subprogram dummy
argument differs from the corresponding actual argument in its
number of dimensions or number of elements. Controlled by
-array together with -arguments settings.
- Subprogram NAME: argument mismatch at position n
- A character dummy argument is larger than the corresponding
actual argument, or a Hollerith dummy argument is larger than the
corresponding actual argument. Controlled by -arguments
setting.
- Subprogram NAME: argument usage mismatch
- ftnchek detects a possible conflict between the way a
subprogram uses an argument and the way in which the argument is
supplied to the subprogram. The conflict can be one of two types,
as outlined below.
-
- Dummy arg is modified, Actual arg is const or expr A
dummy argument is an argument as named in a SUBROUTINE or FUNCTION
statement and used within the subprogram. An actual argument is an
argument as passed to a subroutine or function by the caller.
ftnchek is saying that a dummy argument is modified by the
subprogram, implying that its value is changed in the calling
module. The corresponding actual argument should not be a constant
or expression, but rather a variable or array element which can be
legitimately assigned to. Controlled by the
-usage=arg-const-modified option.
-
- Dummy arg used before set, Actual arg not set Here a
dummy argument may be used in the subprogram before having a value
assigned to it by the subprogram. The corresponding actual argument
should have a value assigned to it by the caller prior to invoking
the subprogram. Controlled by the -usage=var-uninitialized
option.
- This warning is not affected by the -arguments setting.
- Subprogram NAME invoked inconsistently
- Here the mismatch is between the datatype of the subprogram
itself as used and as defined. For instance, if the user declares
INTEGER FUNCTION COUNT(A)
and invokes COUNT in another module as
N = COUNT(A)
without declaring its datatype, it will default to real type, based
on the first letter of its name. The calling module should have
included the declaration
INTEGER COUNT
- Given for -arguments setting 2 or 3.
- Subprogram NAME: varying length argument lists:
- An inconsistency has been found between the number of dummy
arguments (parameters) a subprogram has and the number of actual
arguments given it in an invocation. ftnchek keeps track of
all invocations of subprograms (CALL statements and expressions
using functions) and compares them with the definitions of the
subprograms elsewhere in the source code. The Fortran compiler
normally does not catch this type of error. Given for
-arguments setting 1 or 3.
- Variable not declared. Type has been implicitly defined
- When printing the symbol table for a module, ftnchek
will flag with an asterisk all identifiers that are not explicitly
typed and will show the datatype that was assigned through implicit
typing. This provides support for users who wish to declare all
variables as is required in Pascal or some other languages. This
message appears only when the -symtab option is in effect.
Alternatively, use the -declare flag if you want to get a
list of all undeclared variables.
- Variables declared but never referenced
- Detects any identifiers that were declared in your program but
were never used, either to be assigned a value or to have their
value accessed. Variables in COMMON are excluded. Controlled by the
-usage=var-unused option.
- Variables set but never used
- ftnchek will notify the user when a variable has been
assigned a value, but the variable is not otherwise used in the
program. Usually this results from an oversight. Controlled by the
-usage=var-set-unused option.
- Variables used before set
- This message indicates that an identifier is used to compute a
value prior to its initialization. Such usage may lead to an
incorrect value being computed, since its initial value is not
controlled. Controlled by the -usage=var-uninitialized
option.
- Variables may be used before set
- Similar to used before set except that ftnchek is not
able to determine its status with certainty. ftnchek assumes
a variable may be used before set if the first usage of the
variable occurs prior in the program text to its assignment.
Controlled by the -usage=var-uninitialized option.
- Warning: DO index is not integer
- This warning is only given when the DO bounds are integer, but
the DO index is not. It may indicate a failure to declare the index
to be an integer. Controlled by -truncation=real-do option.
- Warning: integer quotient expr ... converted to real
- The quotient of two integers results in an integer type result,
in which the fractional part is dropped. If such an integer
expression involving division is later converted to a real
datatype, it may be that a real type division had been intended.
Controlled by -truncation=int-div-real option.
- Warning: Integer quotient expr ... used in exponent
- The quotient of two integers results in an integer type result,
in which the fractional part is dropped. If such an integer
expression is used as an exponent, it is quite likely that a real
type division was intended. Controlled by
-truncation=int-div-exponent option.
- Warning: NAME not set when RETURN encountered
- The way that functions in Fortran return a value is by
assigning the value to the name of the function. This message
indicates that the function was not assigned a value before the
point where a RETURN statement was found. Therefore it is possible
that the function could return an undefined value.
- Warning: Nonstandard syntax: adjustable size cannot be
concatenated here
- The Fortran 77 Standard (sec. 6.2.2) forbids concatenating
character variables whose size is an asterisk in parentheses,
except in an assignment statement. Controlled by
-f77=mixed-expr.
- Warning: Nonstandard syntax : significant characters past 72
columns
- This warning is given under the -f77=long-line setting
if the -columns setting has been used to increase the
statement field width, and a statement has meaningful program text
beyond column 72. Standard Fortran ignores all text in those
columns, but some compilers do not. Thus the program may be treated
differently by different compilers.
- Warning: Nonstandard syntax : Statement out of order.
- ftnchek will detect statements that are out of the
sequence specified for ANSI standard Fortran 77. Table 1
illustrates the allowed sequence of statements in the Fortran
language. Statements which are out of order are nonetheless
interpreted by ftnchek, to prevent ``cascades'' of error
messages. The sequence counter is also rolled back to prevent
repetition of the error message for a block of similar statements.
Controlled by the -f77=statement-order option.
-
--------------------------------------------------------
| | implicit
| parameter |---------------------
| | other specification
format |---------------|---------------------
and | | statement-function
entry | data |---------------------
| | executable
--------------------------------------------------------
Table 1
- Warning: Possible division by zero
- This message is printed out wherever division is done (except
division by a constant). Use it to help locate a runtime division
by zero problem. Controlled by -division option.
- Warning: real truncated to intg
- ftnchek has detected an assignment statement which has a
real expression on the right, but an integer variable on the left.
The fractional part of the real value will be lost. If you
explicitly convert the real expression to integer using the INT or
NINT intrinsic function, no warning will be printed. A similar
message is printed if a double precision expression is assigned to
a single precision variable, etc. Controlled by
-truncation=demotion option.
- Warning: subscript is not integer
- Since array subscripts are normally integer quantities, the use
of a non-integer expression here may signal an error. Controlled by
-truncation=real-subscript option.
- Warning: Unknown intrinsic function
- This message warns the user that a name declared in an
INTRINSIC statement is unknown to ftnchek. Probably it is a
nonstandard intrinsic function, and so the program will not be
portable. The function will be treated by ftnchek as a
user-defined function. This warning is not suppressed by any
option, since it affects ftnchek's analysis of the program.
However, if the intrinsic function is in one of the supported sets
of nonstandard intrinsics, you can use the -intrinsic
setting to cause ftnchek to recognize it.
LIMITATIONS AND EXTENSIONS
ftnchek accepts ANSI standard Fortran-77 programs with
some minor limitations and numerous common extensions.
- Limitations:
-
- The dummy arguments in statement functions are treated like
ordinary variables of the program. That is, their scope is the
entire subprogram, not just the statement function definition.
The checking of FORMAT statements is lax, tolerating missing
separators (comma, etc.) between format descriptors in places where
the Standard requires them, and allowing .d fields on
descriptors that should not have them. It does warn under
-f77=format-edit-descr about nonstandard descriptor types
(like O), and supported extensions.
There are some syntactic extensions and Fortran 90 elements that
ftnchek accepts but does very little checking. For instance,
pointer usage (whether the nonstandard Cray syntax or the Fortran
90 syntax) is not checked other than for set and used status. It is
hoped that some day more thorough checking will be implemented, but
for now the user should regard the acceptance of these syntactic
features simply as a convenience to enable checking of other
aspects of code that contains them. See the section Extensions for
specifics about what features are accepted but not fully checked.
If a user-supplied subprogram has the same name as one of the
nonstandard intrinsic functions recognized by ftnchek, it
must be declared in an EXTERNAL statement in any routine that
invokes it. Otherwise it will be subject to the checking normally
given to the intrinsic function. Since the nonstandard intrinsics
are not standard, this EXTERNAL statement is not required by the
Fortran 77 Standard. Using the -intrinsic=none setting,
recognition of most nonstandard intrinsics (excepting only those
needed to support the double complex data type) can be turned off.
See the lists of supported nonstandard intrinsic functions under
the discussion of the -intrinsic setting above.
- Extensions:
-
- All of these extensions (except lower-case characters) will
generate warnings if the relevant -f77 option is set. Some
of the extensions listed below are part of the Fortran-90 Standard.
These are indicated by the notation (F90).
Tabs are permitted, and translated into equivalent blanks which
correspond to tab stops every 8 columns. The standard does not
recognize tabs. Note that some compilers allow tabs, but treat them
differently. The treatment defined for DEC FORTRAN can be achieved
using the -source=dec-tab setting.
Strings may be delimited by either quote marks or apostrophes. A
sequence of two delimiter characters is interpreted as a single
embedded delimiter character. (F90)
Strings may contain UNIX-style backslash escape sequences. They
will be interpreted as such if the -source=unix-backslash
setting is given. Otherwise the backslash character will be treated
as a normal printing character.
Source code can be in either Fortran 90 free format or
traditional fixed format. (F90)
A semicolon is allowed as a statement separator. (F90)
Lower case characters are permitted, and are converted
internally to uppercase except in character strings. The standard
specifies upper case only, except in comments and strings. (F90)
Hollerith constants are permitted, in accordance with the
Fortran 77 Standard, appendix C. They should not be used in
expressions, or confused with datatype CHARACTER.
The letter 'D' (upper or lower case) in column 1 is treated as
the beginning of a comment. There is no option to treat such lines
as statements instead of comments.
Statements may be longer than 72 columns provided that the
setting -columns was used to increase the limit. According
to the standard, all text from columns 73 through 80 is ignored,
and no line may be longer than 80 columns.
Variable names may be longer than six characters. The standard
specifies six as the maximum. ftnchek permits names up to 31
characters long (F90).
Variable names may contain underscores and dollar signs (or
other non-alphabetic characters as specified by the
-identifier-chars option). These characters are are treated
the same as alphabetic letters. The default type for variables
beginning with these characters is REAL. In IMPLICIT type
statements specifying a range of characters, the dollar sign
follows Z and is followed by underscore. (Any other user-defined
characters are treated the same as the dollar sign.) Fortran 90
permits underscores in variable names.
The UNIX version tolerates the presence of preprocessor
directives, namely lines beginning with the pound sign (#). These
are treated as comments, except for #line directives, which are
interpreted, and are used to set the line number and source file
name for warnings and error messages. Note that #include directives
are not processed by ftnchek. Programs that use them for
including source files should be passed through the preprocessor
before being input to ftnchek. As noted below,
ftnchek does process INCLUDE statements, which have a
different syntax. An optional program, ftnpp(1L)
(available separately) provides preprocessing that properly handles
INCLUDE files.
The Fortran 90 DO ... ENDDO control structure is permitted. The
CYCLE and EXIT statements are accepted. All of these may have an
optional do-construct name, but construct names are not checked for
consistency. (F90)
The Fortran 90 SELECT CASE construct is accepted. (F90)
Construct names are also accepted on IF, THEN, ELSE, ENDIF and
SELECT CASE statements. (F90)
The ACCEPT and TYPE statements (for terminal I/O) are permitted,
with the same syntax as PRINT.
The so-called ``Cray pointer'' syntax is tolerated. It is not
the same as the Fortran 90 POINTER statement. There is no real
checking of the statement other than basic syntax. The form of this
statement is
POINTER (pointer, pointee) [,(pointer,
pointee)]
The pointer variables are assigned a data type of INTEGER *4. Usage
checking of the pointee variables is suppressed, since in practice
they are accessed indirectly via the pointers.
The following Fortran 90 pointer related syntaxes are accepted:
ALLOCATABLE, POINTER, and TARGET statements and the same attributes
in type declarations; ALLOCATE, DEALLOCATE, and NULLIFY executable
statements; pointer assignment using => operator; and the
intrinsic functions ALLOCATED and ASSOCIATED. Little semantic
checking of pointer variables and operations is done beyond basic
set and used status. For instance, there is no checking for such
errors as dangling pointers, or use of unallocated arrays.
Statements may have any number of continuation lines. The
Fortran 77 and Fortran 90 standards allow a maximum of 19 in fixed
source form. The Fortran 90 standard allows a maximum of 39 in free
source form.
Relational (comparison) operators composed of punctuation,
namely: < <= == /= > >= are allowed. (F90)
Inline comments, beginning with an exclamation mark, are
permitted. (F90)
NAMELIST I/O is supported. The syntax is the same as in Fortran
90.
FORMAT statements can contain a dollar sign to indicate
suppression of carriage-return. An integer expression enclosed in
angle brackets can be used anywhere in a FORMAT statement where the
Fortran 77 Standard allows an integer constant (except for the
length of a Hollerith constant), to provide a run-time value for a
repeat specification or field width.
Nonstandard keywords are allowed in I/O statements,
corresponding to those in VMS Fortran.
The IMPLICIT NONE statement is supported. The meaning of this
statement is that all variables must have their data types
explicitly declared. Rather than flag the occurrences of such
variables with syntax error messages, ftnchek waits till the
end of the module, and then prints out a list of all undeclared
variables, as it does for the -declare option. (F90)
Data types INTEGER, REAL, COMPLEX, and LOGICAL are allowed to
have an optional precision specification in type declarations. For
instance, REAL*8 means an 8-byte floating point data type. The
REAL*8 datatype is not necessarily considered equivalent to DOUBLE
PRECISION, depending on the -wordsize setting. The Fortran
77 Standard allows a length specification only for CHARACTER data.
ftnchek supports the DOUBLE COMPLEX type specification
for a complex quantity whose real and imaginary parts are double
precision. Mixed-mode arithmetic involving single-precision complex
with double-precision real data, prohibited under the Standard,
yields a double complex result.
Combined type declarations and data-statement-like initializers
are accepted. These have the form of a standard Fortran 77 type
declaration, followed by a slash-delimited list of constants like
that used in a DATA statement. An example of the syntax is
INTEGER N / 100 /
This bastard form of initializing declaration was not adopted in
Fortran 90. Such declarations should be written using the standard
form described below, which is accepted by ftnchek.
There is limited support for Fortran 90 attribute-based type
declarations. This style of declaration is distinguished by the use
of a double colon (::) between the list of attributes and the list
of declared variables. The features supported may be adequate for
novice programmers, but are not yet sufficient for
professional-quality Fortran 90 programs. I hope to add support for
more features in future releases. I invite volunteers to assist in
this task. See the ToDo file in the source code distribution for
details. The attributes currently accepted, besides all the usual
data types, are DIMENSION, EXTERNAL, INTRINSIC, PARAMETER, and
SAVE. The new form of declaration also allows assignment of values
to the variables declared. At present, the (LEN=value) form
of specifying character lengths is also accepted. Kind
specifications, using (KIND=value) are parsed but are not
processed: all kinds are treated as default kind. Also, there is
little checking of these declarations beyond basic syntax.
Many commonly found nonstandard intrinsic functions are
provided. See the discussion of -intrinsic for a list of
functions and how to control which ones are recognized.
Argument checking is not tight for those nonstandard intrinsics
that take arrays or mixed argument types.
ftnchek permits the INCLUDE statement, which causes
inclusion of the text of the given file. The syntax is
INCLUDE 'filename'
This is compatible with Fortran 90. If the
-source=vms-include option is given, ftnchek follows
VMS conventions with respect to this statement: it assumes a
default extension of .for if no filename extension is given,
and allows the qualifier /[NO]LIST following the filename, to
control the listing of the included file. There is no support for
including VMS text modules.
In diagnostic output relating to items contained in include
files, the location of the error is specified by both its location
in the include file and the location in the parent file where the
file was included.
ftnchek accepts PARAMETER statements which lack
parentheses. These will be warned about if the
-f77=param-noparen flag is given.
ftnchek accepts PARAMETER definitions that involve
intrinsic functions and exponentiation by a non-integer exponent.
Both of these cases are prohibited by the Fortran 77 Standard, and
will be warned about if the -f77=param-intrinsic flag is
given. If an intrinsic function value is a compile-time integer
constant, ftnchek will evaluate it. This allows better
checking if the parameter is used in declaring array sizes. Fortran
90 allows intrinsic functions in PARAMETER definitions.
The intrinsic functions that are evaluated are:
| ABS
| IABS
| DIM
| IDIM
| MAX
|
| MAX0
| MIN
| MIN0
| MOD
| SIGN
|
| ISIGN
| LEN
| ICHAR
| INDEX
| |
The functions of integer arguments are evaluated only if the
arguments are integer constant expressions. (These may involve
integer constants, parameters, and evaluated intrinsic functions.)
The function LEN is evaluated if its argument is an expression
involving only character constants and variables whose length is
not adjustable. The functions ICHAR and INDEX are evaluated only if
the arguments are character constants. ftnchek gives a
warning if it needs the value of some intrinsic function that is
not evaluated.
NEW FEATURES
Here are the changes from Version 3.2 to
Version 3.3:
- 1.
- Front-end has been rewritten for unlimited lookahead,
eliminating the longstanding bug that caused incorrect
interpretation of statements whose ambiguity was not resolved in
the first line.
- 2.
- The -mkhtml option is now available in the MS-DOS
version.
- 3.
- Added support for Fortran 90 pointer related syntax: ALLOCATE,
DEALLOCATE, and NULLIFY statements; the ALLOCATABLE, POINTER and
TARGET attributes in type declarations; the pointer assigment
operator => and intrinsic functions ALLOCATED and ASSOCIATED;
and deferred-shape array declarations. At present these new syntax
features are accepted but not properly checked. This feature was
added by Robert Landrito.
- 4.
- The -f77 and -f90 pointer option
controlling warnings about ``Cray pointers'' has been renamed to
cray-pointer. The -f77=pointer option now instead
controls warnings for code containing Fortran 90 pointer-related
syntax.
- 5.
- Re-implemented -mkhtml processing so it is now much
faster on source files containing many routines.
- 6.
- Changed the arrangement of the test directory so there is no
longer any need to modify the distribution in order to run the test
suite (check.bat) under MS-DOS.
- 7.
- Fixed bug in reading numeric settings on command line when
setting name abbreviated to 3 characters.
- 8.
- Fixed bug causing spurious warning for a GOTO referring to a
labeled END statement when the statement before END was a FORMAT.
- 9.
- New flag -f77=character to control warnings about
extensions to the Fortran 77 character data type. Accompanying this
new flag is support for Fortran 90 rules for character variable
declarations that evaluate to zero or negative length, allowing
them and treating negative length values as zero.
- 10.
- Fixed minor bug in printing of comments and blank lines
following last END statement in -list mode.
BUGS
ftnchek still has much room for improvement.
Your feedback is appreciated. We want to know about any bugs you
notice. Bugs include not only cases in which ftnchek issues
an error message where no error exists, but also if ftnchek
fails to issue a warning when it ought to. Note, however, that
ftnchek is not intended to catch all syntax errors (see
section on Limitations). Also, it is not considered a bug for a
variable to be reported as used before set, if the reason is that
the usage of the variable occurs prior in the text to where the
variable is set. For instance, this could occur when a GOTO causes
execution to loop backward to some previously skipped statements.
ftnchek does not analyze the program flow, but assumes that
statements occurring earlier in the text are executed before the
following ones.
We especially want to know if ftnchek crashes for any
reason. It is not supposed to crash, even on programs with syntax
errors. Suggestions are welcomed for additional features which you
would find useful. Tell us if any of ftnchek's messages are
incomprehensible. Comments on the readability and accuracy of this
document are also welcome.
You may also suggest support for additional extensions to the
Fortran language. These will be included only if it is felt that
the extensions are sufficiently widely accepted by compilers.
If you find a bug in ftnchek, first consult the list of
known bugs below to see if it has already been reported. Also check
the section entitled ``Limitations and Extensions'' above for
the section entitled ``Limitations and Extensions'' above for
restrictions that could be causing the problem. If you do not find
the problem documented in either place, then send a report
including
- 1.
- The operating system and CPU type on which ftnchek is
running.
- 2.
- The version of ftnchek and values of any environment
options or settings defined in startup file. (Capturing the output
of ftnchek -help is useful for this.)
- 3.
- A brief description of the bug.
- 4.
- If possible, a small sample program showing the bug.
The report should be sent to Dr. Robert Moniot (see contact
information in section entitled ``Installation and Support'').
information in section entitled ``Installation and Support'').
Highest priority will be given to bugs which cause
ftnchek to crash.
Certain problems that arise when checking large programs can be
fixed by increasing the sizes of the data areas in ftnchek.
(These problems are generally signaled by error messages beginning
with ``Oops''.) The simplest way to increase the table sizes is by
recompiling ftnchek with the LARGE_MACHINE macro name
defined. Consult the makefile and README file for the method of
doing this.
The following is a list of known bugs.
- 1.
- Bug: Used-before-set message is suppressed for any variable
which is used as the loop index in an implied-do loop, even if it
was in fact used before being set in some earlier statement. For
example, consider J in the statement
-
WRITE(5,*) (A(J), J=1,10)
Here ftnchek parses the I/O expression, A(J), where J is
used, before it parses the implied loop where J is set. Normally
this would cause ftnchek to report a spurious
used-before-set warning for J. Since this report is usually in
error and occurs fairly commonly, ftnchek suppresses the
warning for J altogether.
Prognosis: A future version of ftnchek is planned which
will handle implied-do loops correctly.
- 2.
- Bug: Variables used (not as arguments) in statement-function
subprograms do not have their usage status updated when the
statement function is invoked.
-
Prognosis: To be fixed in a future version of
ftnchek.
- 3.
- Bug: VAX version does not expand wildcards in filenames on the
command line if they are followed without space by an option, e.g.
ftnchek *.f/calltree would not expand the *.f. This is because
VMS-style options without intervening space are not supported by
the GNU shell_mung routine that is used to expand wildcards.
-
Prognosis: unlikely to be fixed.
- 4.
- Bug: checking for nonstandard format edit descriptors is done
only in FORMAT statements, not in character strings used as
formats.
-
Prognosis: may be fixed someday.
ACKNOWLEDGEMENTS
ftnchek was designed by Dr. Robert
Moniot, professor at Fordham University. During the academic year
of 1988-1989, Michael Myers and Lucia Spagnuolo developed the
program to perform the variable usage checks. During the following
year it was augmented by Lois Bigbie to check subprogram arguments
and COMMON block declarations. Brian Downing assisted with the
implementation of the INCLUDE statement. John Quinn wrote the
common block usage checks. Heba Elsayed wrote the label table
printout and label usage checks. Nelson H. F. Beebe of the
University of Utah added most of the new code to implement the
-makedcls feature and wrote the dcl2inc script. The
-mkhtml feature was contributed by Mark McVeigh of Framatome
ANP, Inc. The -reference feature was contributed by Gerome
Emmanuel, Ecole des mines, U. Nancy (slightly modified). The
-vcg option was contributed by Dr. Philip Rubini of
Cranfield University, UK. The support for Cray pointer syntax was
provided by John Dannenhoffer of United Technologies Research
Center. John C. Bollinger of Indiana University added the parser
syntax for the SELECT CASE construct. Robert Landrito added the
parser syntax for F90 pointer-related features. Additional features
will be added as time permits. As of Version 2.5, the name was
changed from forchek to ftnchek, to avoid confusion
with a similar program named forcheck, developed earlier at
Leiden University.
We would like to thank John Amor of the University of British
Columbia, Reg Clemens of the Air Force Phillips Lab in Albuquerque,
Markus Draxler of the University of Stuttgart, Victor Eijkhout of
the University of Tennessee at Knoxville, Greg Flint of Purdue
University, Daniel P. Giesy of NASA Langley Research Center, Fritz
Keinert of Iowa State University, Judah Milgram of the University
of Maryland College Park, Hugh Nicholas of the Pittsburgh
Supercomputing Center, Dan Severance of Yale University, Phil
Sterne of Lawrence Livermore National Laboratory, Larry Weissman of
the University of Washington, Warren J. Wiscombe of NASA Goddard,
and Nelson H. F. Beebe of the University of Utah, for pointing out
bugs and suggesting some improvements. Stefan A. Deutscher, Gunnar
Duus, Clive Page of the University of Leicester, Stephan Wefing of
Heidelberg University, and Bob Wells of Oxford University were
extremely helpful as alpha testers. We also thank Jack Dongarra for
putting ftnchek into the netlib library of publicly
available software.
INSTALLATION AND SUPPORT
The ftnchek program is free
software. It can be obtained by anonymous ftp from many software
servers, including ftp://netlib.org/fortran . Note that
on Netlib the distribution is named ftnchek.tar.gz whereas
on most other servers the file name includes the version number,
e.g. ftnchek-3.3.0.tar.gz. If the file extension is
.Z, uncompress with the Unix uncompress(1)
utility. If the file extension is .gz, uncompress with the
GNU gunzip(1L)
program. Then use tar(1) to
unpack the files into a subdirectory.
Installation requires a C compiler for your computer. See the
INSTALL file provided with the distribution for instructions on
installing ftnchek on your system. Executable binary for
particular systems such as IBM PC or Macintosh, as available, can
be obtained by anonymous ftp from ftp://ftp.dsm.fordham.edu/pub/ftnchek
. Assistance in preparing such executable binary forms is welcome.
The nroff version of this document is named
ftnchek.man. On UNIX systems, this file can be used as the
man page, but actually it is a multi-purpose source file which is
used to produce the other forms of the documentation. The
cleaned-up man page document, created during installation of
ftnchek, is named ftnchek.1. The distribution also
includes a plain ASCII version named ftnchek.doc, a
PostScript version named ftnchek.ps, an HTML version in
directory html, and a VMS HELP version named
ftnchek.hlp.
Information about the latest version and the status of the
project can be obtained by visiting ftnchek's home page,
http://www.dsm.fordham.edu/~ftnchek
. For further information and to report bugs, you may contact Dr.
Robert Moniot, whose contact information can be found by a Web
search for his name and Fordham University. (E-mail address is not
provided here because it attracts unsolicited commercial e-mail,
but it is easily constructed by combining his last name with the
name of the university and the edu domain.)
SEE ALSO
dcl2inc(1L),
dtoq(1L),
dtos(1L),
f77(1),
fd2s(1L),
fs2d(1L),
ftnpp(1L),
pfort(1L),
qtod(1L),
sf3(1L),
stod(1L).
xsf3(1L),
xvcg(1L).