ルール
gotoの 使用を避ける
goto 文は、コードの追跡と保守を困難にする 非構造化制御フローを作成します。
対応言語: 45+はじめに
goto コード内の任意のポイントに直接ジャンプし、自然な実行フローを中断させます。これにより、状態、エラー処理、およびパフォーマンスに関する推論が非常に困難になります。goto を使用したコードの保守は、潜在的なバグや意図しない動作のリスクを高めます。構造化された代替手段は、予測可能で読みやすく、保守しやすいコードを生成します。
なぜ重要なのか
セキュリティ上の影響: 構造化されていないジャンプは、検証や認可チェックをバイパスし、機密性の高い操作を露呈させる可能性があります。
パフォーマンスへの影響: 複雑なgotoチェーンはプロファイリングと最適化を困難にし、非効率な実行パスのリスクを高めます。
コードの保守性:gotoは、安全にリファクタリングしたり拡張したりすることが困難な、スパゲッティのような制御フローを生み出します。
攻撃対象領域: 不適切なジャンプは、意図せず安全でないコードパスを露呈させたり、セキュリティ上重要なセクションをスキップしたりする可能性があります。
コード例
❌ 非準拠:
<?php
for ($i = 0; $i < 10; $i++) {
if ($i == 3) {
goto end;
}
echo "$i\n";
}
end:
echo "Jumped out!";
?>
誤っている理由: goto文は非構造化ループを作成し、フローを推論したり、追加のロジックを安全に挿入したりすることを困難にします。
✅ 準拠済み:
<?php
for ($i = 0; $i < 10; $i++) {
if ($i == 3) {
break;
}
echo "$i\n";
}
echo "Jumped out!";
?>
これが重要な理由:forループを使用することで、制御フローが明示的、予測可能、かつ保守可能になり、同一の動作を維持します。
❌ 非準拠:
function process(items) {
for (const item of items) {
if (!item) {
console.error('Invalid item detected');
return false;
}
}
return true;
}なぜそれが間違っているのか:gotoジャンプはエラーパスと通常の実行を不明瞭にし、追跡や拡張を困難にするためです。
✅ 準拠済み:
function process(items) {
for (const item of items) {
if (!item) {
console.error('Invalid item detected');
return false;
}
}
return true;
}これが重要である理由:構造化されたループと早期リターンにより、ロジックが明確になり、エラー処理が明示的になり、メンテナンスが容易になります。
まとめ
構造化され、読みやすく、安全なコードを維持するために、goto の使用は避けてください。予測可能な制御フローのためには、ループ、関数、早期リターンを使用してください。これにより、メンテナンスコストが削減され、潜在的なバグが防止され、安全な実行パスが確保されます。

