From: j8takagi Date: Tue, 23 Jun 2026 06:53:41 +0000 (+0900) Subject: Valgrindで表示されたメモリーの問題に対応 X-Git-Tag: v0.6p00~15 X-Git-Url: https://j8takagi.net/gitweb?a=commitdiff_plain;h=f92d2bc4be1368ced2c70b90c04c5f5fb8ba530d;p=yacasl2.git Valgrindで表示されたメモリーの問題に対応 --- diff --git a/src/cerr.c b/src/cerr.c index 753a5f9..9e9d219 100644 --- a/src/cerr.c +++ b/src/cerr.c @@ -4,6 +4,7 @@ void cerr_init() { cerr = malloc_chk(sizeof(CERR), "cerr"); cerr->num = 0; + cerr->msg = NULL; } CERR *cerr = NULL; @@ -46,6 +47,9 @@ void setcerr(int num, const char *str) { /* 現在のエラー番号を設定 */ cerr->num = num; + if(cerr->msg != NULL) { + FREE(cerr->msg); + } /* 現在のエラーメッセージを設定 */ cerr->msg = malloc_chk(CERRMSGSIZE + 1, "cerr.msg"); if(0 < strlen(str) && strlen(str) <= CERRSTRSIZE) { diff --git a/src/comet2.c b/src/comet2.c index 3cd95cd..73796ca 100644 --- a/src/comet2.c +++ b/src/comet2.c @@ -71,10 +71,10 @@ int main(int argc, char *argv[]) break; case 'v': fprintf(stdout, cmdversion, version); - return 0; + goto comet2fin; case 'h': fprintf(stdout, usage, argv[0]); - return 0; + goto comet2fin; case '?': fprintf(stderr, usage, argv[0]); setcerr(212, ""); /* invalid option */ @@ -98,8 +98,8 @@ int main(int argc, char *argv[]) exec(); /* プログラム実行 */ } comet2_shutdown(); /* COMET II仮想マシンのシャットダウン */ -comet2fin: free_cmdtable(HASH_CMDTYPE); +comet2fin: if(cerr->num > 0) { stat = 1; } diff --git a/src/monitor.c b/src/monitor.c index 7cd34b1..b9ed2fa 100644 --- a/src/monitor.c +++ b/src/monitor.c @@ -370,10 +370,17 @@ void free_moncmdline(MONCMDLINE *moncmdl) int monquit() { int stat = 0; + comet2_shutdown(); freebps(); free_cmdtable(HASH_CMDTYPE); free_cmdtable(HASH_CODE); + + /* Readline 関連のメモリを明示的に解放 */ + rl_clear_history(); + rl_cleanup_after_signal(); + rl_free_line_state(); + if(cerr->num > 0) { stat = 1; } @@ -389,10 +396,10 @@ void monitor() MONCMDTYPE cmdtype = MONREPEAT; do { + FREE(buf); buf = readline(monitor_prompt); /* EOFの処理 */ if(buf == NULL) { - FREE(buf); FREE(last_buf); exit(monquit()); } @@ -400,11 +407,9 @@ void monitor() if(buf[0] == '\0') { if(last_buf == NULL) { /* 前回実行したコマンドがなければ何もしない */ - FREE(buf); fprintf(stdout, ">\n"); continue; } else { - FREE(buf); buf = strdup_chk(last_buf, "monitor.buf_repeat"); cmdtype = MONREPEAT; } diff --git a/test/system/comet2monitor/Define.mk b/test/system/comet2monitor/Define.mk deleted file mode 120000 index d3c4919..0000000 --- a/test/system/comet2monitor/Define.mk +++ /dev/null @@ -1 +0,0 @@ -../../Template/Define.mk \ No newline at end of file diff --git a/test/system/comet2monitor/Define.mk b/test/system/comet2monitor/Define.mk new file mode 100644 index 0000000..ef83233 --- /dev/null +++ b/test/system/comet2monitor/Define.mk @@ -0,0 +1,169 @@ +# autotest.mk > test_template > Define.mk +# 自動テスト用の変数、マクロ定義 + +ifndef DEFINE_INCLUDED +DEFINE_INCLUDED = 1 + +# シェルコマンドをデバッグするときは、DEBUGSH変数を設定してmakeを実行する +# 例: DEBUGSH=1 make +ifdef DEBUGSH + SHELL := /bin/sh -x +endif + +# 現在の日時 +DATE = $(shell date +"%F %T") + +# Makefile +MAKEFILE := Makefile + +###################################################################### +# コマンド +###################################################################### + +CAT := cat +CHMOD := chmod +CP := cp +DEV_NULL := /dev/null +DIFF := diff -c +ECHO := echo +EXPR := expr +FILE := file -b -e ascii +FIND := find +GREP := grep +LINECOUNT := wc -l +LN := ln -s +MKDIR := mkdir -p +MV := mv +PRINTF := printf +REALPATH := realpath +SED := sed +TEST := test +TIME := time +TR := tr +VALGRIND := valgrind +VALGRIND_LOGFILE := _valgrind.log +VALGRINDFLAG := -q --leak-check=full --show-leak-kinds=all --suppressions=../readline.supp --log-file=$(VALGRIND_LOGFILE) +VALGRIND_CMDLOGFILE := valgrind.log + +###################################################################### +# テストグループとテストでの共通マクロ +###################################################################### + +# chk_var_null: 引数がNULLの場合、エラー +# 用例: $(call chk_var_null,var) +define chk_var_null + $(if $1,,$(error NULL argument)) +endef + +# chk_file_ext: 指定されたファイルが実在する場合、エラー +# 用例: $(call chk_file_ext,file) +define chk_file_ext + $(if $(wildcard $1),$(error $1 exists in $(CURDIR))) +endef + +# 指定したディレクトリーを作成 +# 引数は、ディレクトリー名 +# 用例: $(call create_dir,name) +define create_dir + $(call chk_var_null,$1) + $(call chk_file_ext,$1) + $(MKDIR) $1 +endef + + +# ファイル1からファイル2への相対パス +# 引数は、ファイル名1、ファイル名2 +# 用例: $(call rel_to,file1,file2) +define rel_to + $(strip $(shell $(REALPATH) --relative-to=$1 $2)) +endef + +# テストディレクトリーのMakefileを作成 +# 引数は、Makefile名、依存ファイル群 +# 用例: $(call create_makefile,file,list_include_file) +define create_makefile + $(RM) $1 + $(foreach infile,$2,$(ECHO) "include ../$(infile)" >>$1; ) + $(if $(filter $(SRC),c),$(call puts_cmd_c,$1)) +endef + +# C言語の関数をテストするための設定を、指定されたファイルに出力 +# 引数は、ファイル名 +# 用例: $(call puts_cmd_c,file) +define puts_cmd_c + $(ECHO) >>$1 + $(ECHO) "CC := gcc" >>$1 + $(ECHO) "CFLAGS := -Wall" >>$1 + $(ECHO) >>$1 + $(ECHO) ".INTERMEDIATE:" "$$""(CMD_FILE)" >>$1 + $(ECHO) >>$1 + $(ECHO) "CMDSRC_FILE := cmd.c" >>$1 + $(ECHO) "TESTTARGET_FILES := # Set test target files" >>$1 + $(ECHO) >>$1 + $(ECHO) "$$""(CMD_FILE):" "$$""(CMDSRC_FILE)" "$$""(TESTTARGET_FILES)" >>$1 + $(ECHO) " ""$$""(CC)" "$$""(CFLAGS)" "-o" "$$""@" "$$""^" >>$1 +endef + +###################################################################### +# テストグループのディレクトリー +###################################################################### + +# テストグループとテストの変数を定義したMakefile +DEFINE_FILE := Define.mk + +# テストのターゲットを定義したMakefile +TEST_MAKEFILE := Test.mk + +# テストグループのMakefileとしてコピーされるファイル +GROUP_MAKEFILE := Group.mk + +# DEFINE_FILEの相対パス +DEFINE_FILE_REL = $(call rel_to,$(GROUPDIR),$(DEFINE_FILE)) + +# TEST_MAKEFILEの相対パス +TEST_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(TEST_MAKEFILE)) + +# GROUP_MAKEFILEの相対パス +GROUP_MAKEFILE_REL = $(call rel_to,$(GROUPDIR),$(GROUP_MAKEFILE)) + +###################################################################### +# テストのディレクトリー +###################################################################### + +# テストコマンドファイル +CMD_FILE := cmd + +# valgrindテストコマンドファイル +VALGRIND_CMD_FILE := cmd_valgrind + +# テスト説明ファイル +DESC_FILE := desc.txt + +# テスト想定ファイル +TEST0_FILE := 0.txt + +# テスト結果ファイル +TEST1_FILE := 1.txt + +# テストの、想定結果と結果の差分ファイル +DIFF_FILE := diff.log + +# テストエラーファイル +ERR_FILE := err.log + +# テストログファイル +LOG_FILE := summary.log + +# 実行時間ファイル +TIME_FILE := time.log + +# valgrindによるメモリーチェックファイル +VALGRIND_FILE := valgrind.log + +# テスト詳細レポートファイル +DETAIL_FILE := detail.log + +# テストの結果として作成されるファイル群 +TEST_RES_FILES := $(TEST1_FILE) $(DIFF_FILE) $(ERR_FILE) $(LOG_FILE) $(DETAIL_FILE) $(TIME_FILE) + +endif diff --git a/test/system/comet2monitor/break_help_2/0.txt b/test/system/comet2monitor/break_help_2/0.txt index 97169d1..8f1d3af 100644 --- a/test/system/comet2monitor/break_help_2/0.txt +++ b/test/system/comet2monitor/break_help_2/0.txt @@ -1,8 +1,8 @@ COMET II machine code monitor. Type ? for help. +Info: arguments '1' are ignored. > b ? 1 breakpoint manipulate: b[reak] a[dd]
b[reak] d[el]
b[reak] l[ist] b[reak] r[eset] -Info: arguments '1' are ignored. diff --git a/test/system/comet2monitor/break_help_2/cmd b/test/system/comet2monitor/break_help_2/cmd index 7952f10..bd44f3a 100755 --- a/test/system/comet2monitor/break_help_2/cmd +++ b/test/system/comet2monitor/break_help_2/cmd @@ -1 +1 @@ -../../../../comet2monitor &1 | sed '/^(comet2 monitor) /d' diff --git a/test/system/comet2monitor/dump_3/0.txt b/test/system/comet2monitor/dump_3/0.txt index f8069e3..02be83f 100644 --- a/test/system/comet2monitor/dump_3/0.txt +++ b/test/system/comet2monitor/dump_3/0.txt @@ -1,9 +1,9 @@ COMET II machine code monitor. Type ? for help. > l sum_10.o +Info: arguments '#40' are ignored. > d 0 #20 #40 #0000: adr : 0000 0001 0002 0003 0004 0005 0006 0007 0008 0009 000A 000B 000C 000D 000E 000F ------------------------------------------------------------------------------------- #0000: 0000: 7001 0000 7002 0000 3622 1010 0015 2621 2210 0017 4110 0016 6500 0010 6400 0007 #0000: 0010: 1120 0018 7120 7110 8100 0001 000A 0001 0000 0000 0000 0000 0000 0000 0000 0000 #0000: 0020: 0000 -Info: arguments '#40' are ignored. diff --git a/test/system/comet2monitor/dump_3/cmd b/test/system/comet2monitor/dump_3/cmd index 0734c47..21cef75 100755 --- a/test/system/comet2monitor/dump_3/cmd +++ b/test/system/comet2monitor/dump_3/cmd @@ -1 +1 @@ -../../../../comet2monitor &1 | sed '/^(comet2 monitor) /d' diff --git a/test/system/comet2monitor/readline.supp b/test/system/comet2monitor/readline.supp new file mode 100644 index 0000000..d33e583 --- /dev/null +++ b/test/system/comet2monitor/readline.supp @@ -0,0 +1,35 @@ +{ + readline_reachable_leak_generic + Memcheck:Leak + match-leak-kinds: reachable + ... + fun:readline + ... +} + +{ + ncurses_reachable_leak_generic + Memcheck:Leak + match-leak-kinds: reachable + ... + fun:tgetent_sp + ... +} + +{ + ncurses_setupterm_reachable_leak + Memcheck:Leak + match-leak-kinds: reachable + ... + fun:_nc_setupterm + ... +} + +{ + gnu_history_reachable_leak + Memcheck:Leak + match-leak-kinds: reachable + ... + fun:add_history + ... +} \ No newline at end of file