2.3 制限を制御するコマンドラインオプション
m4には調整できる制限がいくつかあります。互換性のため、m4は他の実装で制限を制御するオプションも一部受け付けますが、GNU m4ではその制限は自動的に無制限です(ハードウェアとオペレーティングシステムの制約だけに制限されます)。
-g--gnuこの実装のすべての拡張を有効にします。このM4リリースでは、このオプションは常に既定で有効です。現時点では、それより前に指定した--traditionalを上書きする場合だけに有用です。ただし、GNUの動作が既定であると、互換性のないGNU M4拡張をすべて避ける、厳密にPOSIX準拠のクライアントを書くことができません。完全なPOSIXの動作を強制するには、POSIXにないコマンドラインオプションを使わなければならないためです。そのため、将来のM4では、環境変数
POSIXLY_CORRECTが設定されている場合、暗黙に--traditionalを使うよう変更される予定です。意図的にGNU拡張を使うプロジェクトでは、その意図を示すために--gnuの使用を検討してください。そうすれば、ユーザーが新しいM4へ更新し、環境にPOSIXLY_CORRECTを設定していた場合でも、原因不明の動作不良を避けられます。-G--traditionalSystem V版と比べて、この実装で追加されたすべての拡張を抑制します。一覧は他の版の
m4との互換性を参照してください。-H num--hashsize=numシンボル検索用の内部ハッシュテーブルの大きさをnumエントリーにします。性能上は素数が望ましいものの、検査は行いません。既定値は65537エントリーです。過度に多くのマクロを定義するのでない限り、この値を増やす必要はないはずです。
-
-L num --nesting-limit=numマクロ呼び出しの入れ子を人為的にnum段までに制限し、この制限を超えるとプログラムの実行を停止します。指定しない場合、スタックオーバーフローを検出できるプラットフォームでは既定で無制限、それ以外では1024段です。0は無制限を意味しますが、その場合、深く入れ子になったコードはスタックオーバーフローを起こす可能性があります。
このオプションの正確な効果は、動的な再帰よりも、テキスト上の入れ子に関係すると考える方が適切です。複雑な
m4入力を機械的に生成した場合や、規模が大きくなるとうまく動かない再帰アルゴリズムの診断に役立ってきました。ほとんどのユーザーは、このオプションを既定値から変更する必要がありません。このオプションには、無限の再走査ループを中断する能力はありません。こうしたループは、必ずしも大量のメモリやスタック領域を消費しないからです。再走査ループを巧みに使えば、
m4に時間のかかる複雑な計算をさせ、有用な結果を得られます。この領域に制限を設けると、m4の能力を損ないます。病的な例は多数あり、「define(`a', `a')a」は最も単純な例にすぎません(ただし他の版のm4との互換性を参照)。GNUm4にこれらの検出を期待するのは、コンパイラシステムに無限ループの検出と診断を期待するようなものです。これは、一般には決定不能とまではいかなくても、非常に難しい問題です。-B num-S num-T numこれらのオプションはSystem V
m4との互換性のために存在しますが、この実装では何もしません。将来のリリースでは削除される可能性があり、その旨の警告を出します。-N num--diversions=numこれらのオプションはGNU
m4の以前の版との互換性のためだけに存在し、かつては同時に利用できる出力切替先の個数を制御していました。現在は固定の上限がないため、何もしません。将来のリリースでは削除される可能性があり、その旨の警告を出します。