関連情報
ホーム > 製品 > NAG Fortran コンパイラ > エラー検出の例

NAG Fortran コンパイラ(Fortran Builder)のエラー検出の例

ここでは、特に見つけ難いと思われるプログラム上のエラーをいくつか紹介します。
NAG Fortran コンパイラ(Fortran Builder)は、これらのエラーをすべて検出することができます。

エラー項目NAG の
検出状況
@ 割付け配列の初期化忘れ
A 配列の部分的な初期化忘れ
B 大きさ引き継ぎ配列の初期化忘れ
C 固定サイズ配列の初期化忘れ
D 共通ブロックの初期化忘れ
E モジュール変数の初期化忘れ
F 配列引数の寸法の不一致
G 文字引数の長さの不一致
H 定数(パラメタ)引数の変更
I 寸法が異なる配列同士の代入
J 大きさ引き継ぎ配列の範囲外アクセス
K サブルーチン内での DO ループ制御変数の変更
L EQUIVALENCE 経由の DO ループ制御変数の変更
M 解放済のポインタの利用
N 整数オーバーフロー
O 省略された引数の参照
P ビット組込み関数への誤った引数
Q 再帰的に呼び出される手続が非再帰

※ 上記のエラー項目の検出を有効にするには、コンパイラオプション -C=... が必要です。
詳細は「NAG Fortran Compiler, Release 6.1 マニュアル - 2.4 コンパイラオプション」をご参照ください。

※ Fortran Builder では、プロジェクトの設定の「Fortran コンパイラ > 実行時診断」から、コンパイラオプション -C=... を有効/無効にすることができます。

@ 割付け配列の初期化忘れ

[ error01.f90 ]

program main
  implicit none
  integer, allocatable :: a(:)
  allocate (a(3))
  call sub(a)
end program

subroutine sub(x)
  implicit none
  integer x(3)
  print *, x ! 初期化されていない x を参照している!
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=undefined

A 配列の部分的な初期化忘れ

[ error02.f90 ]

program main
  implicit none
  integer i, x(4)
  do i = 1, 3
    x(i) = i
  end do
  print *, x ! 部分的に初期化されていない x を参照している!
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=undefined

B 大きさ引き継ぎ配列の初期化忘れ

[ error03.f90 ]

program main
  implicit none
  integer i(4)
  call sub(i)
end program

subroutine sub(i)
  implicit none
  integer i(*)
  print *, i(1) ! 初期化されていない i(1) を参照している!
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=undefined

C 固定サイズ配列の初期化忘れ

[ error04.f90 ]

program main
  implicit none
  integer i(4)
  call sub(i)
end program

subroutine sub(i)
  implicit none
  integer i(4)
  print *, i(1) ! 初期化されていない i(1) を参照している!
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=undefined

D 共通ブロックの初期化忘れ

[ error05.f90 ]

program main
  implicit none
  integer x
  common /NAG/ x
  print *, x ! 初期化されていない x を参照している!
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=undefined

E モジュール変数の初期化忘れ

[ error06.f90 ]

module mymod
  integer x
end module

program main
  use mymod
  print *, x ! 初期化されていない x を参照している!
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=undefined

F 配列引数の寸法の不一致

[ error07.f90 ]

program main
  implicit none
  integer x(3)
  x = 99
  call sub(x, 4)
  print *, x
end program

subroutine sub(a, n)
  implicit none
  integer n
  integer a(n) ! 配列の寸法が一致していない!
  a(1) = 100
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=calls または -C, -C=all

G 文字引数の長さの不一致

[ error08.f90 ]

program main
  implicit none
  character(3) c
  c = 'abc'
  call sub(c, 4)
  print *, c
end program

subroutine sub(a, n)
  implicit none
  integer n
  character a(n) ! 文字長が一致していない!
  a(1:1) = 'X'
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=calls または -C, -C=all

H 定数(パラメタ)引数の変更

[ error09.f90 ]

program main
  implicit none
  integer, parameter :: x = 99
  call sub(x)
  print *, x
end program

subroutine sub(i)
  implicit none
  integer i
  i = 10  ! i は定数なので変更してはいけない!
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=calls または -C, -C=all

I 寸法が異なる配列同士の代入

[ error10.f90 ]

program main
  implicit none
  integer a(3)
  call sub(a)
  print *, a
contains
  subroutine sub(x)
    integer x(:), y(1)
    y = 99
    x = y  ! x と y の寸法が異なる!
  end subroutine
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=array または -C, -C=all

J 大きさ引き継ぎ配列の範囲外アクセス

[ error11.f90 ]

program main
  implicit none
  integer x(3)
  x = 99
  call sub(x)
end program

subroutine sub(i)
  implicit none
  integer i(*)
  i(4) = 100 ! 配列の範囲外を参照している!
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=calls または -C, -C=all

K サブルーチン内での DO ループ制御変数の変更

[ error12.f90 ]

program main
  implicit none
  integer i
  do i = 1, 10
    call sub(i)
    print *, i
  end do
end program

subroutine sub(i)
  implicit none
  integer i
  i = i + 1 ! ここで値を変更してはいけない!
end subroutine

このエラーの検出を有効にするためのコンパイラオプション

-C=calls または -C, -C=all

L EQUIVALENCE 経由の DO ループ制御変数の変更

[ error13.f90 ]

program main
  implicit none
  integer i, j
  equivalence(i, j)
  j = 0
  do i = 1, 10
    j = j + 1 ! ここで値を変更してはいけない!
    print *, i
  end do
end program

M 解放済のポインタの利用

[ error14.f90 ]

program main
  implicit none
  integer, pointer :: p(:) => null()
  integer, target, allocatable :: a(:)
  allocate (a(4))
  a = (/ 1, 2, 3, 4 /)
  p => a
  deallocate (a)
  print *, p ! 解放されたメモリ領域を参照している!
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=dangling または -C=all

N 整数オーバーフロー

[ error15.f90 ]

program main
  implicit none
  integer n
  n = huge(n)
  print *, n + 1 ! 整数の最大値に 1 を加算している!
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=intovf または -C=all

O 省略された引数の参照

[ error16.f90 ]

program main
  implicit none
  integer :: a = 2, b = 3
  call add_print(a, b)
contains
  subroutine add_print(a, b, c)
    integer, intent(in) :: a, b
    integer, intent(in), optional :: c
    print *, a + b + c ! 省略された引数 c を参照している!
  end subroutine
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=present または -C, -C=all

P ビット組込み関数への誤った引数

[ error17.f90 ]

program main
  implicit none
  integer i
  do i = 1, 100
    print 10, ibset(0, i) ! ここで i は 0〜31 の範囲の値でなければならない!
    10 format (1x, z0)
  end do
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=bits または -C, -C=all

Q 再帰的に呼び出される手続が非再帰

[ error18.f90 ]

integer function func_recursively_called(func_to_call, n)
  implicit none
  external func_to_call
  integer n, m(1000, 1000), func_to_call
  m = n
  if (n < 2) then
	func_recursively_called = func_to_call(func_to_call, n + 1)
  end if
  if (any(m /= n)) then
    func_recursively_called = -999 ! おかしい!
  else
    func_recursively_called = 0    ! OK
  endif
end function

program main
  implicit none
  external func_recursively_called
  integer func_recursively_called
  if (func_recursively_called(func_recursively_called, 1) == 0) then
    print *, 'OK.  No error.'
  else
    print *, 'NG.  BAD'
  endif
end program

このエラーの検出を有効にするためのコンパイラオプション

-C=recursion または -C, -C=all

Results matter. Trust NAG.
Privacy Policy | Trademarks