チャレンジC言語 〜エラーなど〜

今日の内容

コンパイルエラー(警告)

主に,文法ミスや型の不一致などから来るエラー.コンパイラがあやしそうな行を出力するので,比較的見つけやすいバグであることが多い.エラーが複数出る場合は,一番上のものが大抵その根源である.

コンパイルエラー
XXX.c:47: parse(syntax) error before `show_profile2'

意味:main関数中,47行目のshow_profile2 の前で文法解析エラーが起きました.
原因:セミコロン抜けなどが考えられる.
XXX.c:17: `c' undeclared (first use in this function)

意味: 変数cが未宣言です.
原因: 関数の中で変数を宣言し忘れている.
sample.c:137: error: stray '\129' in program
sample.c:137: error: stray '@' in program

意味:(フォーマットから)はぐれた制御文字\129があります.
原因:プログラム中に,全角のスペースがあることが原因(printf()の""の内部にある場合はOK)
sample.c:135:9: warning: unknown escape sequence: '\216'

意味:不明なエスケープ文字です.
原因:printf("")内で,Cygwinで問題となる漢字(補足資料参照)を用いた.
XXX.c:20: unterminated string or character constant

意味:終端しない文字列または文字定数です.
原因:文字列の"か'の閉じ忘れが原因.
XXX.c:18: too many arguments to function `calc_circle_area'

意味:関数calc_circle_areaの引数の数が多すぎます.
原因:関数の実引数の個数が仮引数の個数より多い.関数の()の中の書き間違い.
XXX.c:18: too few arguments to function `calc_circle_area'

意味:関数calc_circle_areaの引数の数が少な過ぎます.
原因:関数の実引数の個数が仮引数の個数より少ない.関数の()の中の書き間違い.
XXX.c:46: incompatible type for argument 1 of `show_profile2'

意味:show_profile2の1番目の引数の型が合いません.
原因:実引数と仮引数の変数の型があっていない.変数とポインタのミスマッチなど.
XXX.c:19: conflicting types for `calc_circle_area'
XXX.c:5: previous declaration of `calc_circle_area'

意味:関数calc_circle_areaの型が以前の宣言と競合しています.
原因:プロトタイプ宣言と関数本体の引数部が食い違っている.
XXX.c:13: incompatible types in assignment

意味:型が合わない代入です.
原因:無理な代入をしようとしている.例えば,ポインタに整数型変数値を代入するなど.
XXX.c:15: warning: too few arguments for format

意味:フォーマットに対して,引数が少なすぎます.
原因:printfやscanfの""中の%dの数に対して,後ろで指定する値の個数が合っていない.
XXX:13: two or more data types in declaration of `show_profile'

意味:2個以上のデータ型がshow_profileの宣言部に存在します.
原因:構造体テンプレートの最後のセミコロン忘れの場合が多い.
XXX:56: unterminated comment

意味:終わらないコメントです.
原因:コメント文が閉じられていない.
struct.c:32: invalid type argument of `->'

意味:->の取る変数の型が不正です.
原因: -> と . の使用法を間違えた場合に出る.
XXX.c:26: invalid operands to binary +

意味:2項演算子+への不正なオペランドです.
原因:演算が適用できない変数(構造体変数など)に無理やり足し算などをしようとしている.
toi1.c:46: error: invalid operands to binary %

意味:2項剰余演算子 % への不正なオペランドです.
原因:整数型以外で剰余を撮ろうとしている.
XXX.c:22: structure has no member named `ages'

意味:この構造体はagesという名前のメンバを持ちません.
原因:構造体のメンバ名の書き間違い.
/cygdrive/c/...:XXX.c:(.text+0xcb): undefined reference to `_prinif'
collect2: ld returned 1 exit status

意味:prinif への参照がありません.ld(リンカ)は終了ステータス1を返しました.
原因:未定義の関数を呼び出している,または,関数名(呼び出し名)の書き間違い.
XXX.c:86: warning: passing arg 1 of `string_length' from incompatible pointer type

意味:関数string_lengthの1番目の引数に互換性のないポインタ型を渡そうとしています.
原因:関数へ配列を渡す時の実引数の指定方法が間違っている.string_length(char msg[255])など.
sample.c:14: error: array subscript is not an integer

意味:配列のインデクスが整数ではありません.
原因:配列のインデクスを浮動小数点または文字型でアクセスしようとした.
switch.c:38: error: label at end of compound statement

意味:複合文の最後がラベルで終わっています.
原因:ブロックの最後に,後に文が続かないラベルをつけている.空文を入れるなどすべき.
switch.c:37: error: label `LABEL_1' used but not defined

意味:ラベル LABEL_1が定義されずに使われています.
原因:ラベルが宣言されていない.ラベル名の間違いなど.
Warning (警告)
XXX.c:16: warning: type mismatch with previous implicit declaration
XXX.c:11: warning: previous implicit declaration of `calc_circle_area'

意味:警告:以前の暗黙的宣言と型が合いません.
    警告:calc_circle_areaが以前に暗黙的に宣言されています.

原因:関数本体が宣言されていない間に呼び出しが現れている.プロトタイプ宣言のし忘れや,関数本体の順番を間違えた場合に起こる.
XXX.c:29: warning: declaration of `p' shadows a parameter

意味:警告:pの宣言によって引数が隠されてしまいます.
原因:関数の仮引数pがあるにも関わらず,ローカル変数pを宣言したためこちらが優先され,仮引数の方が隠れてしまいアクセスできなくなる.
XXX.c:14: warning: data definition has no type or strage class

意味:警告:データの定義において,型または記憶クラスが指定されていません.
原因:データの型宣言を忘れている,または,間違っている.マクロ(#define)の書き忘れ,間違いなど.
XXX.c:54: warning: implicit declaration of function `strcmp'

意味:警告:関数strcmpが暗黙的に宣言されています.
原因:ライブラリヘッダ(この場合,#include<string.h>)を書き忘れている.
・・・他にもいろいろあります.

実行時エラー

コンパイル時にはみつからないエラー.どこでエラーが出たのか特定しにくいため,デバッグが難しい.講義でカバーした内容では,主にポインタ,アドレスの不正な操作が絡む場合に発生しやすい.

実行時エラー
0 [main] a 2820 handle_exceptions: Exception: STATUS_ACCESS_VIOLATION
Segmantation fault (core dumped)

意味:例外エラー:不正なアクセスです.
原因:アクセスしてはいけないメモリ領域を参照しようとした.ポインタ,アドレスの間違った使用に原因がある.指し先のないポインタの値参照や,scanfの&つけ忘れなどに多い.
0 [main] a 540 handle_exceptions: Exception: STATUS_INTEGER_DIVIDE_BY_ZERO

意味:例外エラー:ゼロで割りました.
原因:割り算において,0で割ってしまった.
他にも,stack overflow, heap overflow, out of memoryなどがあります.

masa-n@kobe-u.ac.jp
(C) Masahide Nakamura, Kobe University