minic - Minic Is Not
an
Interpreter of Complete C language.
●minic - Minic Is Not an
Interpreter of Complete C language.
Cインタプリタ(C言語のサブセット)です。
・βリリースです
ソース minic-0.9.34.tar.bz2
-----------------------------------------------------------------
ver.0.9.34 (2018/03/29)
1.strict-aliasing問題に(一応)対応。
2.scanf()で、int型変数をポインタの代わりに使用して受け取っていたのを修正。
3.組み込み関数を追加。
fscanf(), sscanf()
4.以下のようなコードで結果が不正になるのを修正。
double d = 1.234512345123456789012345678901234567890;
printf("%f", d);
(数値の字句解析処理に問題があった)
5.引数に配列を指定できるように修正。
例:func(int argc, char argv[][6], char ccc)
6.sizeof(文字)、sizeof(文字列)に対応。
7.64bit版FreeBSDで以下のコードが正しく動作しない問題を修正。
char *p = NULL;
8.引数にfloatを指定した場合に正しく値が渡らない問題を修正。
ver.0.9.33 (2010/05/15)
1.typedefの不具合を修正。
ポインタ型のtypedefを行い、変数宣言時にカンマ演算子を使用
して複数宣言した場合に、2つ目以降がポインタ型ではないと
判断してしまう誤りを修正。
例:typedef char * char_ptr1;
char_ptr1 a, b, c;
(a, b, c 全てが char * となるのが正しい)
2.比較演算子 == != < <= > >= の構文解析の不具合を修正。
if (1 < a < 5) のようなコードで、構文エラーであると判断し
ていたのを修正。(上記コード自体はC言語の文法的には正し
いので対応)
3.単項演算子 + を実装。(実装してなかった...)
4.三項演算子関連の不具合を修正。
e = a ? b : c = d;
は、Cでは
e = ((a ? b : c) = d);
と解釈され、C++では
e = (a ? b : (c = d));
と解釈される。
以前のバージョンのminicではC++と同じ解釈をしていた。
正しいCの解釈に修正。(つまり e = a ? b : c = d はエラー)
5.printf、sprintfのdouble型対応。および引数10個以下の制限を
取り払った。(但し、スタックサイズに依存します)
6.組み込み関数を追加。
fprintf(), fputs(), getc(), putc(), abort(),
clock(), time(), difftime(), mktime(), asctime(),
ctime(), gmtime(), localtime(), strftime()
7.FreeBSD 8.0で、makeに失敗する件に対応。
libディレクトリ直下のobjを_objにリネーム。
これに伴い各makefileを修正。
8.実行前にバイトコードをスキャンしてグローバル変数のリンク
を行っているが、この際に該当する変数が見つからない場合の
エラーメッセージが不正であったのを修正。
9.main関数が二重定義されていた場合エラーとするよう修正。
(main以外が二重定義された場合、最初の関数が実行される...)
10.ソース中に「#」無しでプリプロセッサのキーワードが出現
するとハングする場合がある件に対応。
ver.0.9.32 (2009/07/15)
1.「たらいまわし関数」を実行すると仮想スタックが破壊されて
しまう不具合に対応。
2.64ビットCPUに対応。Core i7 のマシンで CentOS 64ビット版に
て動作確認。(ただし、ポインタ型のサイズが整数型以上である
ことを前提とした実装なので不完全...)
ver.0.9.31 (2008/06/23)
1.K&R形式で構文解析ミスが発生することのある不具合を修正。
func(n, m)
int n;
int m;
{
printf("%d %d\n", n, m);
}
main(argc, argv)
int argc;
char *argv[];
{
func(1, 2);
}
ver.0.9.30 (2008/02/04)
1.関数プロトタイプ宣言の後に構造体配列の初期化のコードを書
いた場合、要素数が正しく処理されない不具合を修正。
2.strcmp、strncmpを追加。
3.構造体のメンバに関数ポインタを使用した際に不正な動作をす
る不具合に対応。
4.サンプルプログラムを追加。(demos/PL0)
mcc pl0.c -a fib.pl0 で実行できます。
ver.0.9.29 (2007/12/19)
1.ポインタ変数の配列を正しく処理できなくなっていたのを修正。
2.引数の型が固定長配列の場合に正しく処理できない件は未対応。
ver.0.9.28 (2007/08/25)
1.ユーザ定義関数の関数ポインタを用いた呼び出しで、ローカル変
数の領域の計算を間違えていた不具合を修正。
2.ポインタ変数にインデックス[]を使用した場合におかしくなるこ
とがある不具合を修正。(不完全?)
ver.0.9.27 (2007/06/02)
1.switch文の条件式にchar型の変数を用いると不正な動作をする不
具合に対応。
2.組み込み関数exit()を追加。
3.&&や||の演算で、左辺値の場合に値をロードしていない不具
合に対応。
ver.0.9.26 (2007/05/16)
1.関数ポインタに(制限つきで)対応。その2。
組み込み関数に組み込み関数の関数ポインタを渡す <- OK?
組み込み関数にユーザ定義関数の関数ポインタを渡す <- OK
(但し、現段階では qsort のみを実装)
#include <stdlib.h>
int compare_int(void *a, void *b)
{
return((*((int *)a)) - (*((int *)b)));
}
int main(int argc, char *argv[])
{
static int data[] = {4, 2, 3, 6, 3, 2, 1, 3, 5, 7};
int i;
qsort(data, 10, sizeof(int), compare_int);
for (i = 0; i < 10; i++) {
printf("%3d", data[i]);
}
printf("\n");
}
ver.0.9.25 (2007/05/12)
1.関数の戻り値が構造体(ポインタ)の場合にクラッシュする不具合
を修正。(関数ポインタ導入で入ったバグ)
ver.0.9.24 (2007/05/12)
1.関数ポインタの変数宣言で引数なしのタイプに対応。
2.関数ポインタの変数宣言で可変引数のタイプに対応。
func1()
{
printf("hello world.\n");
}
func2(int n, ...)
{
char **pp = (char **)&n + 1;
int i;
for (i = 0; i < n; i++)
printf("%s\n", pp[i]);
}
main()
{
int (*pfunc1)();
int (*pfunc2)(int, ...);
pfunc1 = func1;
(*pfunc1)();
pfunc2 = func2;
(*pfunc2)(4, "hi", "yo", "Genki?", "Desuka?");
}
ver.0.9.23 (2007/05/04)
1.*による逆参照演算関連をバグらせてしまったのを修正。
2.ヘッダファイルbf_search.hおよびbm_search.hをsearch.hに纏めた。
ver.0.9.22 (2007/05/03)
1.関数ポインタに(制限つきで)対応。
(ソースコードがかなりまずい状態になってしまった)
ユーザ定義関数に組み込み関数の関数ポインタを渡す <- OK
ユーザ定義関数にユーザ定義関数の関数ポインタを渡す <- OK
組み込み関数に組み込み関数の関数ポインタを渡す <- NG
組み込み関数にユーザ定義関数の関数ポインタを渡す <- NG
func(char *s)
{
printf("%s world\n", s);
}
main()
{
void (*fptr)(char *);
fptr = func;
(*fptr)("hello");
fptr = printf;
(*fptr)("good morning\n");
}
ver.0.9.21 (2006/07/31)
1.三項演算子の三項目に三項演算子が記述されている場合コンパイル
結果が不正になる不具合に対応。
int main(int argc, char *argv[])
{
int min=2,x=7,max=5;
printf("%d\n",(x<min)?min:(max<x)?max:x);
return(0);
}
ver.0.9.20 (2006/06/27)
1.ローカル変数を宣言と同時に初期化する際に、カンマを用いて複数
初期化することが出来ない不具合を修正。(例 int i = 0, j = 1;)
ver.0.9.19 (2006/06/04)
1.gotoのジャンプ先のラベルが関数内に存在しない場合に異常終了す
る不具合に対応。
ver.0.9.18 (2006/05/22)
1.extern宣言されていない配列のコンパイルで異常終了する件に対応。
ver.0.9.17 (2006/05/14)
1.eval.cで、変数の初期化し忘れを修正。
2.コードバッファのオーバーフローを検出する処理を追加。
ver.0.9.16 (2006/05/13)
1.unsigned char、unsigned int に(一応)対応。
2.int型の変数に対して「(char *)&i + i」のコードが正しく処理され
ない不具合に対応。
3.未定義の変数に「&」をつけると異常終了する不具合に対応。
ver.0.9.15 (2006/05/04)
1.double型の変数に対して単項マイナス演算子が使用出来るよう修正。
ver.0.9.14 (2006/04/02)
1.reallocをstdlib.hに追加し忘れていたので追加した。
2.printfの引数に三項演算子を記述した場合の不具合に対応。
3.三項演算子とカンマ演算子の組み合わせでの不具合に対応。
4.K&R式の関数宣言に(一応)対応。
ver.0.9.13 (2006/03/12)
1.reallocを追加。
2.いくつかの関数で、check_args()呼び出しの第三引数を間違えていた
のを修正。(funcs.c)
3.rx_search()の第三引数にNULLを渡した場合にエラーとなるのを修正。
4.VisualC++2003(Standard)用のプロジェクトファイルを追加。
ver.0.9.12 (2006/03/10)
・構造体メンバのポインタ変数に対してインデックス参照を行うとエラーとなる件に(一応)対応。
ver.0.9.11 (2006/02/09)
・cygwinでコンパイルエラーになる件に対応。
-----------------------------------------------------------------
掲
示板