65323


例えば、c++で以下のようなコードを書くと、間違ってはいますが、スタックの連続した領域へのアクセスによってランタイムがなにか例外を吐くことはしません。

[code]

    int a[1],b[1];
    a[1] = 999; // out of range
    std::cout << b[0] << std::endl; // 999
    
[/code]

また、例えばgoで

[code]

    package main
    
    import (
        "fmt"
    )
    
    func main() {
        var a [1]int
        var b [1]int
        var i int;
    
        b[0] = 123;
        fmt.Scan(&i)
        a[i] = 456; // panic
        fmt.Println(b[0])
    }
    
[/code]

のように書くと、ランタイムにindex out of rangeがpanicとして出ます。  
これはどのようにして検知したものなのでしょうか？  
Arrayはランタイムでもわかるようにサイズを持っていますか？  
もしサイズを持っていないなら、どのようにして判定していますか？  
もしサイズを持っているなら、なぜerrとして返却するようなものではなく、panicを起こすように作られているのですか？


CC BY-SA 4.0
2020-04-02T15:15:49.157
65312
2020-04-03T06:10:27.450
2020-04-02T17:26:27.170
37013
question
go
Golangでは、ランタイムにIndex out of rangeはどのように検知していますか？


<https://blog.golang.org/slices> によると [golang](/questions/tagged/golang
"'golang' のタグが付いた質問を表示") の Array は `len` を持っています (スライスに使えるよう `cap` もあります）。  
配列のインデックスが範囲外のときプログラムはクラッシュする（＝強制停止させられる）ともあります。

現代の高級言語においては配列の範囲外アクセスは明らかなバグであり直ちに修正が必要とされています。すなわちデバッガで停止させられるのがほとんどすべてのユーザーに望まれた動きです（なので
panic ）。配列外の誤ったデータで処理を続けることができてもうれしくないですよね。

# 現代の高級言語としては範囲外アクセスをチェックしない [c](/questions/tagged/c "'c' のタグが付いた質問を表示")
のほうが例外的存在


CC BY-SA 4.0
2020-04-03T06:10:27.450
65323
2020-04-03T06:10:27.450
8589
65312
answer