0
1
プログラミングのエラーについて
プログラミングでコードを実行したときに起きたエラーを教えてください。どんな問題でもいいのでできるだけ多くのエラーが知りたいです。
例えば配列の存在しないインデックスを参照してしまったとか無限ループにはまってしまったなど、どんなに簡単なものでも教えていただけると嬉しいです。
言語のコンパイラおよび実行環境を作成しようと思うのですが、追加機能として思いついたのは実行時エラーを分かりやすくするための工夫を入れたいと思っています。どのように実装するかはまだ考え中ですができるだけ多くのエラーについて知りその中で工夫できるようなものがあればと思っています。また、自作言語ですので大規模な開発というよりも小規模なプログラミングを想定しています。
なのでプログラミングを学習している途中の方がはまるような実行時に起きるエラーなどを教えてほしいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答10件
#1
総合スコア10699
投稿2024/01/16 14:13
プログラミングでコードを実行したときに起きたエラーを教えてください。どんな問題でもいいのでできるだけ多くのエラーが知りたいです。
・知りたい理由を教えてください。集めて何かのデータとして使用されるのでしょうか?
・「具体例」とはどの程度の具体性でしょうか?
#3
総合スコア11
投稿2024/01/16 14:59
編集2024/01/16 15:05ちょっと話がそれるかもしれませんが、snapshot テストの話をしたいと思います
このディレクトリには shiika っという言語でどういうエラーが出るかの例がいくつか載っています
https://github.com/shiika-lang/shiika/tree/main/tests/snapshots
このディレクトリに保存されているファイル群は snapshot といいます
このファイル郡にはある時点でのプログラムの実行結果が保存されています
さきほど上げたディレクトリでは、プログラミング言語がエラーになる場合にはどのようなメッセージを表示するかも載っています
snapshot テストの詳細は省きますが、OSS レポジトリにはこのような自動テストのコードが色々存在するかと思います
なのでこれらを参照すれば多種多様なエラーを効率的に入手することができるのではないでしょうか
また、OSS の issue なども良い収集場所になるかと思いますし、stack over flow や teratail にも多種多様なエラーの例が上げられているかと思います
それらを収集するためにスクレイピングすることを検討するのも良いかもしれません
(もちろんサーバーに負荷をかけすぎないような配慮は必要ですが)
参考までに
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#4
総合スコア85637
投稿2024/01/16 16:01
追加機能として思いついたのは実行時エラーを分かりやすくするための工夫を入れたいと思っています。
コンパイルエラーは除外して、実行時エラー限定と言うことですね。
コンパイルエラーを分かり易くという工夫をしている言語はありますが、実行時エラーを分かり易くは難しいと思うので、実現すれば面白いと思います。
Cであれば、添え字の範囲外アクセスや、ポインターの処理ミスなどによる、segmentation fault を分かり易くというのが嬉しいでしょう。
ただ、今の多くの言語では添え字範囲外によるsegmentation faultは起こらず、「どこそこでこの配列の添え字が範囲外のこれこれ」というエラーメッセージになるかと思いますので、ここはこれ以上は難しい。「添え字範囲外」は多くのケースで結果であってその原因となるバグ(例えば「上限の変数名を間違えている」とか「<=
と<
が違う」とか)まで推論というとAIの世界になるので、ちょっとコンパイラ作成というジャンルを超える気がします。
また、Rubyだと、そもそも「配列の添え字が範囲外」はエラーにならないし。
あとは、メソッドの結果が期待通りでないのに、それをチェックしないままで、その返り値をそのまま使って発生する NullPointerException
ないしそれに類した'NoneType' object has no attribute ~~~
やundefined method ~~~ for nil:NilClass
も、せいぜいメッセージの文言を変えるくらいで(「メソッド~~の呼び出しがNullを返しました」的な)、これ以上はAIの世界な気がします。
バラバラと書くと、
・言語によってよく発生する実行時エラーは異なるので、どんな言語か書いた方が良い
・よくあるエラーの大元の原因を推測する方向に進むのか
・めずらしくてググってもよくわからない実行時エラーのメッセージ文言の工夫を考えるのか
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#6
総合スコア11945
投稿2024/01/17 01:34
編集2024/01/17 06:29「エラー」という言葉が何を指すのかが漠然としすぎている印象を受けます.
例として
無限ループにはまってしまった
というのが挙げられているということは,「何かプログラマの意図していなかった挙動になっている」みたいな話を「エラー」と考えておられるように見えるのですが,だとしたら「意図していなかったかどうか」を判断する術があるのか? というのが疑問です.(そのコードを書いた本人をつれてきて問いただす以外に道はあるのか?)
無限ループを意図してコードを書いたならば当然無限ループしてくれなきゃ困るわけで… すなわち,無限ループすることが「正しい動作」なわけで,そこを誤判定されて「エラーだぞ」とか言われたら,すごくうざい気がします.
(あと,そもそも実行時に「無限ループしている(=本当にそのループから抜けることが未来永劫あり得ない)」のだと判断することも難しそうな…?)
何かしらコードを解析するなどして(コンパイル時とかに?)判定されるのだとしても,while(true){ ... }
とか書いただけで毎回ぐだぐだ言われるとしたらそれもうざいだろうし…?
それはそれとして,めんどくさそうな「エラー」(というかプログラムの間違い)というのは
- オブジェクトをいじくろうとした時点でそのオブジェクトの寿命が尽きている
- 集合の要素についてのループ内でその集合の要素を 追加/削除 等することでループ処理がくっちゃくちゃになる
- 例えば,画像データを画素単位で走査する処理において,走査するポインタの型が間違っている(画素データの型と不一致)
- 一度やれば済む処理を不必要に何度も実施するようなコード
- 本来「エラー(その処理を続行不能)」とすべきところのチェックが抜けているとか十分ではないとか
- 似たようなので,例外の面倒を見るのを忘れている状態とか
- 逆に,問答無用で例外を握りつぶしている奴がいて大変なことになってるとか
- 似たようなので,例外の面倒を見るのを忘れている状態とか
- インクリメントの前置と後置を間違えている
- 浮動小数点な型の「一致」判定
とか?
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#7
総合スコア85637
投稿2024/01/17 04:28
fanaさん
なるほど。
「実行時エラー」と書いてあるので、実行時にエラーメッセージを出して停止する際のメッセージのことかと思いましたが、追記された「無限ループ」は、それとは違いますね。
「実行時にエラーで止まったりはしないけど、意図と違う動作」を検出したいとなると、まず「意図」を記述する仕組みが必要でそれを解釈してそれを参照しながら実行するという今までに無かった仕組みが要りますね。
で、書いてある「意図」がそもそも思っていたとおりに書けておらず、なんのこっちゃとなるみたいな。
質問者さんが、「実行時にエラーメッセージを出して止まったりはしないけど、意図と違う動作を検出」と思っているのかどうか、そこまで考えずに「無限ループ」と書いてしまったのか。
まあ、テスト記述でいいとすると、テスト自動化ツールで実現できていると言えますね。
「無限ループ」は、「~~分以内に停止」で検出できる。
一度やれば済む処理を不必要に何度も実施するようなコード
は無理か。
浮動小数点な型の「一致」判定
これは実行時というよりはコンパイル時に警告出すのですかね。静的型の場合ですが。
実行時に「==
の際に、差の絶対値が、ゼロでなくて、値の絶対値の1万分の1以下なら警告」とかもありか。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#8
総合スコア673
投稿2024/01/19 08:15
それぞれの言語で例外のクラス一覧がドキュメントに載っていると思いますが、そんなイメージですか?
例えばpythonなんかは以下に例外一覧があります。
https://docs.python.org/ja/3/library/exceptions.html#BaseException
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
#9
総合スコア8
投稿2024/01/23 03:51
私はもっぱらC言語ですが、それでよければ。
・文末のセミコロン(;)の抜け。
・かっこの対応不一致。
・printf()関数で、第1引数中に"%d"や"%s"を入れておいて、第2引数の書き忘れ。
・if文、for文などで、条件式の直後にセミコロンを書いてしまうミス。
・if文、for文などで、被制御文を複文にしたいのに、中括弧{}を書き忘れる。
・switch文中でのbreak文の抜け。
・scanf()関数で、第2引数での&の抜け。
・必要なヘッダファイルのインクルード忘れ。
(例)数学関数を使うときのmath.hのインクルードの抜け、など。
・\0と\nの取り違え。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。