598 lines
14 KiB
Groff
598 lines
14 KiB
Groff
.\" $NetBSD: lint.1,v 1.21 2002/01/03 04:25:18 thorpej Exp $
|
|
.\"
|
|
.\" Copyright (c) 1996 Christopher G. Demetriou. All Rights Reserved.
|
|
.\" Copyright (c) 1994, 1995 Jochen Pohl
|
|
.\" All Rights Reserved.
|
|
.\"
|
|
.\" Redistribution and use in source and binary forms, with or without
|
|
.\" modification, are permitted provided that the following conditions
|
|
.\" are met:
|
|
.\" 1. Redistributions of source code must retain the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer.
|
|
.\" 2. Redistributions in binary form must reproduce the above copyright
|
|
.\" notice, this list of conditions and the following disclaimer in the
|
|
.\" documentation and/or other materials provided with the distribution.
|
|
.\" 3. All advertising materials mentioning features or use of this software
|
|
.\" must display the following acknowledgement:
|
|
.\" This product includes software developed by Jochen Pohl for
|
|
.\" The NetBSD Project.
|
|
.\" 4. The name of the author may not be used to endorse or promote products
|
|
.\" derived from this software without specific prior written permission.
|
|
.\"
|
|
.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
|
|
.\" IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
.\" OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
|
.\" IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
|
|
.\" INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
.\" NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
.\" DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
|
.\" THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
.\" (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
|
.\" THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
.\"
|
|
.\" %FreeBSD: src/usr.bin/xlint/xlint/lint.1,v 1.26 2002/11/26 15:32:04 ru Exp %
|
|
.\"
|
|
.\" $FreeBSD$
|
|
.Dd May 24, 2001
|
|
.Dt LINT 1
|
|
.Os
|
|
.Sh 名称
|
|
.Nm lint
|
|
.Nd C プログラムの検証を行う
|
|
.Sh 書式
|
|
.Bk -words
|
|
.Nm
|
|
.Op Fl abceghprvwxzHFV
|
|
.Op Fl s | t
|
|
.Op Fl i | nu
|
|
.Op Fl D Ar name Ns Op = Ns Ar def
|
|
.Op Fl U Ar name
|
|
.Op Fl I Ar directory
|
|
.Op Fl d Ar directory
|
|
.Op Fl L Ar directory
|
|
.Op Fl l Ar library
|
|
.Op Fl o Ar outputfile
|
|
.Op Fl B Ar directory
|
|
.Op Fl X Ar id Ns Op , Ns Ar id ...
|
|
.Ar
|
|
.Nm
|
|
.Op Fl abceghprvwzHFV
|
|
.Op Fl s | t
|
|
.Fl C Ar library
|
|
.Op Fl D Ar name Ns Op = Ns Ar def
|
|
.Op Fl U Ar name
|
|
.Op Fl I Ar directory
|
|
.Op Fl d Ar directory
|
|
.Op Fl B Ar directory
|
|
.Op Fl X Ar id Ns Op , Ns Ar id ...
|
|
.Ar
|
|
.Ek
|
|
.Sh 解説
|
|
.Nm
|
|
ユーティリティは、指定された C のプログラムファイルを解析し、
|
|
バグの可能性がある部分、
|
|
移植性がないと考えられる部分、
|
|
あるいは無駄なコードと考えられる部分
|
|
の検出を試みます。
|
|
加えて、
|
|
.Nm
|
|
ユーティリティは、C コンパイラより厳密な型チェックを行います。
|
|
.Nm
|
|
は最初のフェーズでシンボル
|
|
.Dq Dv lint
|
|
を定義して C プリプロセッサを起動します。
|
|
これにより、ある疑わしいコード部分を
|
|
.Nm
|
|
に変更あるいはスキップさせることができます。
|
|
それゆえ、
|
|
.Nm
|
|
がチェックする全てのコードにおいては、シンボル
|
|
.Sy lint
|
|
は予約語とみなすべきです。
|
|
.Pp
|
|
現在
|
|
.Nm
|
|
が指摘する問題点は以下のものです。
|
|
到達しない文、
|
|
先頭から入らないループ、
|
|
宣言したものの使用しない変数、
|
|
定数値となる論理式。
|
|
関数呼び出しに関しては以下のような矛盾点が指摘されます。
|
|
あるところでは値を返すが別の場所では値を返さない関数の呼び出し、
|
|
引数の個数が変化する関数の呼び出し、
|
|
関数側で想定していない型の引数を渡す関数呼び出し、
|
|
返値を使用しない関数呼び出し、
|
|
返値のない関数の存在しない返値を使用している関数呼び出し。
|
|
.Pp
|
|
ファイル名引数のうち、末尾が
|
|
.Pa .c
|
|
で終わるものは C のソースファイルとみなされます。
|
|
ファイル名が
|
|
.Pa .ln
|
|
で終わるものは、以前
|
|
.Nm
|
|
を
|
|
.Fl i ,
|
|
.Fl o
|
|
あるいは
|
|
.Fl C
|
|
オプション付きで起動した際の結果を格納したファイルとみなされます。
|
|
.Pa .ln
|
|
ファイルは、
|
|
.Xr cc 1
|
|
が
|
|
.Pa .c
|
|
から生成するオブジェクトファイル
|
|
.Pa .o
|
|
に相当します。
|
|
.Nm
|
|
ユーティリティはまた、
|
|
.Fl l
|
|
オプションによって指定された特別なライブラリを受け付けます。
|
|
これは、ライブラリ関数と変数の定義を含むものです。
|
|
.Pp
|
|
.Nm
|
|
ユーティリティは、全ての
|
|
.Pa .c , .ln
|
|
ファイルと
|
|
.Pa llib-l Ns Ar library Ns Pa .ln
|
|
(lint ライブラリ) ファイルを受け取り、
|
|
それらをコマンドラインで指定した順に処理します。
|
|
デフォルトでは、
|
|
.Nm
|
|
は標準 C lint ライブラリ
|
|
.Pq Pa llib-lc.ln
|
|
をファイルリストの最後に付け加えます。
|
|
.Fl i
|
|
オプションが指定されていれば、
|
|
.Pa .ln
|
|
ファイルは無視されます。
|
|
また、
|
|
.Fl o
|
|
オプションあるいは
|
|
.Fl i
|
|
オプションが指定されていれば、
|
|
.Pa llib-l Ns Ar library Ns Pa .ln
|
|
ファイルは無視されます。
|
|
.Fl i
|
|
オプションが指定されて
|
|
.Em いなければ、
|
|
.Nm
|
|
の 2番目の
|
|
パスでこのファイルリストが相互一貫性チェックに用いられます。
|
|
このとき、
|
|
もし問題箇所が与えられたソースファイルからではなく
|
|
インクルードファイルのひとつに端を発するものならば、
|
|
表示されるソースファイル名の後ろに疑問符が付けられます。
|
|
.Pp
|
|
特別な入力ファイル名
|
|
.Dq Pa -
|
|
は、
|
|
.Nm
|
|
に (ファイルの終端まで) 標準入力から入力を取らせ、これを
|
|
.Pa .c
|
|
ファイルとして処理させます。
|
|
.Fl i
|
|
フラグが指定され
|
|
.Dq Pa -
|
|
が入力ファイルの 1 個として指定された場合、出力ファイル名を指定するために
|
|
.Fl o
|
|
フラグもまた指定される必要があります。
|
|
オプションは次の通りです:
|
|
.Bl -tag -width indent
|
|
.It Fl a
|
|
.Vt long
|
|
型以外の変数に対する
|
|
.Vt long
|
|
値の代入を報告します。
|
|
.It Fl aa
|
|
.Fl a
|
|
に加え、
|
|
小さい型への暗黙の型変換を引き起こす
|
|
.Em あらゆる
|
|
整数値代入を報告します。
|
|
.It Fl b
|
|
到達し得ない
|
|
.Ic break
|
|
文を報告します。
|
|
このオプションはデフォルトでは有効ではありません。
|
|
なぜなら、ほとんどの
|
|
.Xr lex 1
|
|
および多くの
|
|
.Xr yacc 1
|
|
出力はこのような break を数多く含むからです。
|
|
.It Fl c
|
|
移植性に問題のあるキャストについて報告します。
|
|
.It Fl e
|
|
.Vt enum
|
|
型に対する不正操作や
|
|
.Vt enum
|
|
型と
|
|
.Sy 整数
|
|
型間の組み合わせについて報告します。
|
|
.It Fl g
|
|
.Xr gcc 1
|
|
が C 言語に対して行っているいくつかの拡張機能についての警告を抑制します。
|
|
現在のところ、これに該当するのは以下のものです。
|
|
自動変数の集合型初期化式に現れる非定数式、
|
|
void 型へのポインタに対する算術操作、
|
|
.Vt enum
|
|
宣言の最後のコンマ、
|
|
C++ スタイルの
|
|
.Dq Li //
|
|
コメント、
|
|
サイズが 0 の構造体、
|
|
左辺値でない配列の添字付け、
|
|
旧形式の関数宣言を無効化するプロトタイプ宣言、
|
|
long long 整数型。
|
|
.Fl g
|
|
オプションはまた、キーワード
|
|
.Ic asm
|
|
および
|
|
.Ic inline
|
|
を有効にします
|
|
(
|
|
.Ic asm
|
|
および
|
|
.Ic inline
|
|
の先頭にアンダスコアを付けたキーワードは
|
|
常に利用可能です)。
|
|
.It Fl h
|
|
いくつかの発見的テストを適用して
|
|
バグを発見し、スタイルを洗練し、無駄を省くことを試みます。
|
|
.It Fl i
|
|
コマンドラインの各
|
|
.Pa .c
|
|
ファイルに対して
|
|
.Pa .ln
|
|
ファイルを生成します。
|
|
これらの
|
|
.Pa .ln
|
|
ファイルは
|
|
.Nm
|
|
の最初のパスの結果に過ぎず、
|
|
関数間の一貫性チェックは行われません。
|
|
.It Fl n
|
|
標準ライブラリに対する一貫性チェックを行いません。
|
|
.It Fl p
|
|
他の C 方言への移植性に関するチェックを試みます。
|
|
.It Fl r
|
|
重複した宣言が見つかった場合、前回の宣言の位置を報告します。
|
|
.It Fl s
|
|
厳密な ANSI C モードでチェックします。
|
|
ANSI C で必要とされる警告およびエラーを出力します。
|
|
従来の C と ANSI C とで異なる振る舞いをする構造に対しての警告は行いません。
|
|
.Fl s
|
|
オプション指定時は、
|
|
プリプロセッサマクロとして
|
|
.Dv __STRICT_ANSI__
|
|
が定義されます。
|
|
.It Fl t
|
|
従来の C モードでチェックします。
|
|
このモードでは
|
|
.Dv __STDC__
|
|
は定義されません。
|
|
従来の C で許可されない構造に対して警告が出力されます。
|
|
従来の C と ANSI C とで異なる振る舞いをする構造に対しての警告は抑制されます。
|
|
マシンタイプ (例:
|
|
.Dv sun3 )
|
|
およびマシンアーキテクチャ (例:
|
|
.Dv m68k )
|
|
を記述したプリプロセッサマクロは、
|
|
先頭および末尾のアンダスコア無しで定義されます。
|
|
キーワード
|
|
.Ic const , volatile
|
|
および
|
|
.Ic signed
|
|
は従来の C モードでは利用できません (しかし、先頭にアンダスコアを
|
|
付したもう一方のキーワードは依然利用可能です)。
|
|
.It Fl u
|
|
使用されているが定義されていない、あるいは定義されているが使用されていない
|
|
関数および外部変数についての報告を行いません
|
|
(この機能は、大規模プログラムを構成する一部のファイルに対して
|
|
.Nm
|
|
を走らせる場合に向いています)。
|
|
.It Fl v
|
|
関数中の未使用引数に関する報告を抑制します。
|
|
.It Fl x
|
|
.Ic extern
|
|
宣言で参照されているが一度も使用されていない変数について報告します。
|
|
.It Fl z
|
|
定義されていない構造体に関する報告を抑制します
|
|
(例えば、中身を関知せずに構造体へのポインタを用いる場合など)。
|
|
.It Fl B Ar path
|
|
バイナリ
|
|
.Pa lint1
|
|
と
|
|
.Pa lint2
|
|
を検索するために使用するパスです。
|
|
デフォルトは
|
|
.Pa /usr/libexec
|
|
です。
|
|
.It Fl C Ar library
|
|
.Pa llib-l Ns Ar library Ns Pa .ln
|
|
という名前の
|
|
.Nm
|
|
ライブラリを作成します。
|
|
このライブラリは、全ての入力ファイル
|
|
.Pa .c
|
|
および
|
|
.Pa .ln
|
|
から作られます。
|
|
これらのファイルに含まれる全ての大域関数および大域変数の宣言が
|
|
新しく作られるライブラリに書き出された後、
|
|
.Nm
|
|
は
|
|
.Fl l
|
|
オプションで指定されたライブラリを含めた全ての入力ファイルに対して
|
|
相互一貫性のチェックを行います。
|
|
.It Fl D Ar name Ns Op = Ns Ar def
|
|
.Xr cpp 1
|
|
のために
|
|
.Ic #define
|
|
ディレクティブと同様にしてマクロ
|
|
.Ar name
|
|
を定義します。
|
|
右辺値が指定されない場合、マクロ
|
|
.Ar name
|
|
は 1 と定義されます。
|
|
.It Fl I Ar directory
|
|
インクルードファイルを検索するディレクトリリストに
|
|
.Ar directory
|
|
を追加します。
|
|
.It Fl d Ar directory
|
|
インクルードファイルを検索するデフォルトの場所を
|
|
.Pa /usr/include
|
|
の代りに
|
|
.Ar directory
|
|
にします。
|
|
.It Fl l Ar library
|
|
lint ライブラリ
|
|
.Pa llib-l Ns Ar library Ns Pa .ln
|
|
をインクルードします。
|
|
.It Fl L Ar directory
|
|
lint ライブラリを標準の場所から探す前に、
|
|
.Ar directory
|
|
および
|
|
.Ar directory Ns Pa /lint
|
|
の中を探します。
|
|
.It Fl F
|
|
ファイルのパス名全体を表示します。
|
|
.Nm
|
|
ユーティリティは通常、パスを除いたファイル名だけを表示します。
|
|
.It Fl H
|
|
もし問題箇所がインクルードファイルに端を発するものならば、
|
|
.Nm
|
|
はソースファイル名と それに続く疑問符に代えて
|
|
インクルードファイル名を表示します。
|
|
.It Fl o Ar outputfile
|
|
出力ファイル名を
|
|
.Ar outputfile
|
|
とします。
|
|
出力ファイルは
|
|
.Nm
|
|
の2番目のパスの入力ファイルとなるものです。
|
|
.Fl o
|
|
オプションは単に、このファイルを指定された名前でファイルに保存します。
|
|
同時に
|
|
.Fl i
|
|
オプションも指定されていれば、これらのファイルは一貫性をチェックされません。
|
|
.Pa llib-l Ns Ar library Ns Pa .ln
|
|
ファイルを作成する際には、余分なメッセージを抑制するため、
|
|
.Fl u
|
|
オプションの使用を推奨します。
|
|
lint ライブラリのソースファイルが単に外部インタフェースに過ぎない場合は、
|
|
.Fl v
|
|
オプションを用いると便利です。
|
|
.It Fl U Ar name
|
|
プリプロセッサが定義する全てのマクロ
|
|
.Ar name
|
|
を取り除きます。
|
|
.It Fl V
|
|
制御プログラムが C プリプロセッサおよび
|
|
.Nm
|
|
の第1 および第2 パスを実行する際のコマンドラインを表示します。
|
|
.It Fl w
|
|
警告をエラーとして扱います。
|
|
.It Fl X Ar id Ns Op , Ns Ar id ...
|
|
id で指定されるエラーメッセージを抑制します。
|
|
メッセージと id のリストは
|
|
.Xr lint 7
|
|
を参照してください。
|
|
.El
|
|
.Ss 入力文法
|
|
.Nm
|
|
の第 1 パスは標準的な C ソースファイルを読み込みます。
|
|
.Nm
|
|
ユーティリティは以下のような C のコメントをコマンドとして認識します。
|
|
.Bl -tag -width indent
|
|
.It Li /* ARGSUSED Ns Ar n Li */
|
|
最初の
|
|
.Ar n
|
|
個の引数に対してのみ使用チェックを行います。
|
|
.Ar n
|
|
を省略すると 0 と解釈されます
|
|
(このオプションは、次の関数に対して
|
|
.Fl v
|
|
オプションと同様の働きをします)。
|
|
.It Li /* BITFIELDTYPE */
|
|
型が整数の場合、
|
|
不正なビットフィールド型に関するエラーメッセージを抑制します。
|
|
また、可搬性の無いビットフィールド型の警告を抑制します。
|
|
.It Xo
|
|
.Li /* CONSTCOND */
|
|
又は
|
|
.Li /* CONSTANTCOND */
|
|
又は
|
|
.Li /* CONSTANTCONDITION */
|
|
.Xc
|
|
次の式に対する定数オペランドに関する報告を抑制します。
|
|
.It Xo
|
|
.Li /* FALLTHRU */
|
|
又は
|
|
.Li /* FALLTHROUGH */
|
|
.Xc
|
|
.Ic case
|
|
あるいは
|
|
.Ic default
|
|
ラベルのついた文への fall through に関する報告を抑制します。
|
|
このディレクティブはそれらのラベルの直前に置く必要があります。
|
|
.It Li /* LINTLIBRARY */
|
|
ファイル先頭で、このファイル中で定義される全ての関数および変数が
|
|
.Em 使用されている
|
|
とマークします。
|
|
また、未使用の関数引数に関する報告も行いません。
|
|
.It Xo
|
|
.Li /* LINTED Oo Ar comment Oc Li */
|
|
又は
|
|
.Li /* NOSTRICT Oo Ar comment Oc Li */
|
|
.Xc
|
|
未使用の変数あるいは関数に関するものを除き、
|
|
ファイル内に閉じた問題点に関する警告を抑制します。
|
|
このディレクティブは、
|
|
.Nm
|
|
警告が発生する場所の直前の行に置く必要があります。
|
|
.It Li /* LONGLONG */
|
|
long long 整数型の使用に関する報告を抑制します。
|
|
.It Li /* NOTREACHED */
|
|
しかるべき場所において、未到達コードに関する報告を抑制します
|
|
(このコメントは通常、
|
|
.Xr exit 3
|
|
のような関数の呼び出しの直後に置きます)。
|
|
.It Li /* PRINTFLIKE Ns Ar n Li */
|
|
.Nm
|
|
は最初の
|
|
.Pq Ar n Ns -1
|
|
個の引数を普通にチェックします。
|
|
.Ar n
|
|
番目の引数は
|
|
.Xr printf 3
|
|
のフォーマット文字列と同様に解釈され、
|
|
残りの引数をチェックするために用いられます。
|
|
.It Li /* PROTOLIB Ns Ar n Li */
|
|
もし
|
|
.Ar n
|
|
が 0 でなければ、
|
|
.Nm
|
|
は関数宣言プロトタイプを関数宣言として取り扱います。
|
|
このディレクティブは
|
|
.Li /* LINTLIBRARY */
|
|
と共にのみ用いることができます。
|
|
.Ar n
|
|
が 0 の場合は、関数プロトタイプは通常通り取り扱われます。
|
|
.It Li /* SCANFLIKE Ns Ar n Li */
|
|
.Nm
|
|
は最初の
|
|
.Pq Ar n Ns -1
|
|
個の引数を普通にチェックします。
|
|
.Ar n
|
|
番目の引数は
|
|
.Xr scanf 3
|
|
のフォーマット文字列と同様に解釈され、
|
|
残りの引数をチェックするために用いられます。
|
|
.It Li /* VARARGS Ns Ar n Li */
|
|
後続する関数宣言において、引数個数に関する通常のチェックを抑制します。
|
|
最初の
|
|
.Ar n
|
|
個の引数のデータ型がチェックされます。
|
|
.Ar n
|
|
が指定されない場合は 0 と解釈されます。
|
|
.El
|
|
.Pp
|
|
.Fl i
|
|
オプションおよび
|
|
.Fl o
|
|
オプションを用いると、ひと組の C ソースファイルに対して
|
|
インクリメンタルに
|
|
.Nm
|
|
を適用することが可能です。
|
|
一般に、各ソースファイルに対して
|
|
.Fl i
|
|
オプション付きで
|
|
.Nm
|
|
を一度起動します。
|
|
このとき、
|
|
.Pa .c
|
|
に対応して
|
|
.Pa .ln
|
|
ファイルが作成され、
|
|
それらのソースファイルに関する全てのメッセージが表示されます。
|
|
全てのソースファイルに対して個別の
|
|
.Nm
|
|
処理が済んだ後、全ての
|
|
.Pa .ln
|
|
ファイルと必要な
|
|
.Fl l Ar library
|
|
オプションを付け、(
|
|
.Fl i
|
|
オプション無しで) もう一度
|
|
.Nm
|
|
を起動します。
|
|
ここでファイル間の一貫性に関する問題点が表示されます。
|
|
この方式は
|
|
.Xr make 1
|
|
を用いるとうまくいきます。
|
|
.Xr make 1
|
|
を用いると、
|
|
前回ソースファイルの組が
|
|
.Nm
|
|
された後、修正のあったファイルに対してのみ
|
|
.Nm
|
|
を起動することができます。
|
|
.Sh 環境変数
|
|
.Bl -tag -width LIBDIR
|
|
.It Ev LIBDIR
|
|
.Bk -words
|
|
.Fl l Ar library
|
|
.Ek
|
|
オプションで指定されたライブラリが存在するディレクトリ。
|
|
この環境変数が定義されていない場合は、ライブラリ検索のために
|
|
デフォルトパスとして
|
|
.Pa /usr/libdata/lint
|
|
が用いられます。
|
|
.It Ev TMPDIR
|
|
一時ファイル用のパスは通常、この環境変数をセットすることで変更できます。
|
|
.It Ev CC
|
|
C コンパイラプログラムの場所。
|
|
デフォルトは
|
|
.Pa /usr/bin/cc
|
|
です。
|
|
.El
|
|
.Sh 関連ファイル
|
|
.Bl -tag -width /usr/libdata/lint/llib-lc.ln -compact
|
|
.It Pa /usr/libexec/lint Ns Bq Pa 12
|
|
プログラム
|
|
.It Pa /usr/libdata/lint/llib-l*.ln
|
|
前もって作成されている様々な lint ライブラリ
|
|
.It Pa /tmp/lint*
|
|
一時ファイル
|
|
.El
|
|
.Sh 関連項目
|
|
.Xr cc 1 ,
|
|
.Xr cpp 1 ,
|
|
.Xr make 1
|
|
.Sh 作者
|
|
.An Jochen Pohl
|
|
.Sh バグ
|
|
.Bl -item
|
|
.It
|
|
.Xr exit 3
|
|
や
|
|
.Xr longjmp 3
|
|
および戻って来ない他の関数は正しく理解されません。
|
|
これらは様々な不正診断の原因となります。
|
|
.It
|
|
最初の extern 宣言の前でのみ用いられる static 関数は、
|
|
未使用であると報告されます。
|
|
.It
|
|
.Fl o
|
|
オプションによって作られたライブラリは、のちの
|
|
.Nm
|
|
実行で用いた場合、
|
|
ライブラリ作成時に報告されたある種のエラーが再度報告され、
|
|
ライブラリ作成時に用いたオリジナルのソースファイルの行番号およびファイル名が
|
|
エラーメッセージ中に表示されることがあります。
|
|
そのため、lint ライブラリ作成には
|
|
.Fl C
|
|
オプションを用いることを推奨します。
|
|
.El
|