]> j8takagi.net git repositories - yacasl2.git/commitdiff
Valgrindで表示されたメモリーの問題に対応
authorj8takagi <j8takagi@nifty.com>
Tue, 23 Jun 2026 06:53:41 +0000 (15:53 +0900)
committerj8takagi <j8takagi@nifty.com>
Tue, 23 Jun 2026 06:53:41 +0000 (15:53 +0900)
src/cerr.c
src/comet2.c
src/monitor.c
test/system/comet2monitor/Define.mk [changed from symlink to file mode: 0644]
test/system/comet2monitor/break_help_2/0.txt
test/system/comet2monitor/break_help_2/cmd
test/system/comet2monitor/dump_3/0.txt
test/system/comet2monitor/dump_3/cmd
test/system/comet2monitor/readline.supp [new file with mode: 0644]

index 753a5f9078f899d718e0958e10251fcdfb0b06ff..9e9d2195945857dcdb9923116938bf56c7834fc5 100644 (file)
@@ -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) {
index 3cd95cd5ff65ba9c7b0f9a2acc9494c2c45f5959..73796ca83badf6e990cd8e05202c39436d17388a 100644 (file)
@@ -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;
     }
index 7cd34b1246b4d00816c55e72a119a2e86b053979..b9ed2fa9a4e6c9a7bd843060b3ee173ed359b415 100644 (file)
@@ -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;
             }
deleted file mode 120000 (symlink)
index d3c4919feda77621a8c4d48339da2afc4e45694b..0000000000000000000000000000000000000000
+++ /dev/null
@@ -1 +0,0 @@
-../../Template/Define.mk
\ No newline at end of file
new file mode 100644 (file)
index 0000000000000000000000000000000000000000..ef832331a0bc53440946ea622b941b3441be08d3
--- /dev/null
@@ -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
index 97169d1a68d0a593571187089a95b7a9a71390b1..8f1d3af9c0618582c9e7845cc14b9834f06cb25f 100644 (file)
@@ -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] <address>
     b[reak] d[el] <address>
     b[reak] l[ist]
     b[reak] r[eset]
-Info: arguments '1' are ignored.
index 7952f104e83626cd4387a7401198d065afaebf61..bd44f3acfd768dfdb27273d1b1ac80f72a4bd7a2 100755 (executable)
@@ -1 +1 @@
-../../../../comet2monitor <break_help_2.monitor | sed '/^(comet2 monitor) /d'
+../../../../comet2monitor <break_help_2.monitor 2>&1 | sed '/^(comet2 monitor) /d'
index f8069e320d972dbe88fc14d99d3cf71389d2b4c7..02be83f14fdb616a07a3e798e87a76d3d462b530 100644 (file)
@@ -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.
index 0734c47b4c7d0bca79d7deb3cd714d6de1631b05..21cef755c0284cf25faf7efbac456df4e8442a0c 100755 (executable)
@@ -1 +1 @@
-../../../../comet2monitor <dump_3.monitor | sed '/^(comet2 monitor) /d'
+../../../../comet2monitor <dump_3.monitor 2>&1 | sed '/^(comet2 monitor) /d'
diff --git a/test/system/comet2monitor/readline.supp b/test/system/comet2monitor/readline.supp
new file mode 100644 (file)
index 0000000..d33e583
--- /dev/null
@@ -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