From e999e4726c07adbf4e2491a9cbcd9c51335ab57d Mon Sep 17 00:00:00 2001 From: anzania-btrfs Date: Fri, 11 Sep 2026 03:11:32 +0300 Subject: [PATCH] uboreshaji: ujumbe wa hitilafu kwa akiba/majedwali yenye ukubwa maalum Mdudu #189, #190, #192, na #197 zote zilikuwa na dalili moja: jedwali lenye ukubwa maalum lilifurika KIMYA (bila ujumbe wowote), likisababisha uharibifu wa data au msimbo batili badala ya kusimamisha ukusanyaji kwa uwazi. Uchunguzi wa moja kwa moja ulibaini muundo huu huu bado upo katika maeneo mengine kumi na nane ya mkusanyaji -- majedwali yanayolingana na ukubwa wa mradi (vigezo vya ulimwengu, kazi, wigo/scope, urekebishaji wa anwani, lebo, alama za nje, mfuatano halisi) yenye ukaguzi wa mipaka lakini BILA ujumbe wa hitilafu likiwa limejaa. Masahihisho: - mkaguzi.swa: wigo_vidokezo (kina cha {}), wigo_idadi (vigezo vya wigo), global_idadi (vigezo vya ulimwengu), muundo_count (nodi za miundo), kazi_param_enc_wapi (aina za hoja bapa), kazi_ret_idadi (aina za kurudi) -- zote sasa zinaongeza mkaguzi_makosa, ambayo KWELI husimamisha ukusanyaji (imethibitishwa: stage1.swa inasoma matokeo ya mkaguzi_angalia na kukataa kutoa msimbo ikiwa >0). - msambazaji.swa: ujumbe wa node_mpya() uliokuwa ukiandikwa kama "; DEB:" (ilionekana kama debug leftover) umefanywa ujumbe wa KOSA kamili; muundo_ukubwa_idadi sasa ina ujumbe. - uzalishaji.swa: rela_idadi (maeneo manne), lebo_idadi, nje_idadi, hoja_idadi, anwani_kazi_idadi (hii hasa ilikuwa ikizalisha `&jina` kama 0/null KIMYA badala ya anwani halisi -- mdudu wa uzalishaji wa msimbo batili, si tu usajili uliokosekana), anwani_data_idadi, data_ulimwengu_idadi, na str_idadi -- zote zina ujumbe sasa. Haikubadilisha ukubwa wa jedwali lolote (hilo ni jukumu la marekebisho mengine, mfano #197/#199) -- kazi hii ni ubora wa ujumbe TU. Imejaribiwa moja kwa moja: faili lenye vigezo 1030 vya ulimwengu (zaidi ya kikomo cha 1024) sasa linatoa ujumbe sahihi wa hitilafu mara sita na kusimamisha ukusanyaji (badala ya kutoa msimbo batili kimya); faili lenye viwango 260 vya {} vilivyotagusana pia linatoa ujumbe sahihi. Suti 304/304 + fixpoint 17/17 hazikuathirika. --- msingi/mkusanyaji/mkaguzi.swa | 34 +++++++++++++++++++++++++------- msingi/mkusanyaji/msambazaji.swa | 11 ++++++++++- msingi/mkusanyaji/uzalishaji.swa | 29 +++++++++++++++++++++++++++ 3 files changed, 66 insertions(+), 8 deletions(-) diff --git a/msingi/mkusanyaji/mkaguzi.swa b/msingi/mkusanyaji/mkaguzi.swa index 5499cac..63c165f 100644 --- a/msingi/mkusanyaji/mkaguzi.swa +++ b/msingi/mkusanyaji/mkaguzi.swa @@ -35,6 +35,9 @@ W0 wigo_sukuma() { kama (wigo_vidokezo_idadi < 256) { wigo_vidokezo[wigo_vidokezo_idadi] = wigo_idadi; wigo_vidokezo_idadi = wigo_vidokezo_idadi + 1; + } sivyo { + andika_stderr("KOSA: kina cha kitanzi/tawi (wigo_vidokezo) kimejaa (kikomo 256) — kazi ina viwango vingi mno vya kutagusana vya {}\n"); + mkaguzi_makosa = mkaguzi_makosa + 1; } } @@ -57,6 +60,9 @@ W0 wigo_ongeza(N8* jina, N32 enc) { ast_pool[ast_pool_wapi + i] = 0; ast_pool_wapi = ast_pool_wapi + i + 1; wigo_idadi = wigo_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la vigezo vya wigo (wigo_idadi) limejaa (kikomo 256) kwenye kigezo '%s' — kazi ina vigezo/vitambulisho vingi mno vinavyoonekana kwa wakati mmoja\n", jina); + mkaguzi_makosa = mkaguzi_makosa + 1; } } @@ -165,13 +171,18 @@ N32 mkaguzi_angalia(N32 mzizi) { global_idadi = 0; N32 gn = ast_kushoto[mzizi]; wakati (gn != -1) { - kama (ast_aina[gn] == 35 && global_idadi < 1024) { - global_jina_off[global_idadi] = ast_jina_off[ast_kushoto[gn]]; - N32 genc = ast_thamani[gn]; - // Safu: usemi unapaswa kuiona kama kielekezi (anwani ya msingi) - kama (ast_tiga[gn] != -1) { genc = genc + 1; } - global_aina[global_idadi] = genc; - global_idadi = global_idadi + 1; + kama (ast_aina[gn] == 35) { + kama (global_idadi < 1024) { + global_jina_off[global_idadi] = ast_jina_off[ast_kushoto[gn]]; + N32 genc = ast_thamani[gn]; + // Safu: usemi unapaswa kuiona kama kielekezi (anwani ya msingi) + kama (ast_tiga[gn] != -1) { genc = genc + 1; } + global_aina[global_idadi] = genc; + global_idadi = global_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la vigezo vya ulimwengu (global_idadi) limejaa (kikomo 1024) — mradi una vigezo vya ulimwengu vingi mno\n"); + mkaguzi_makosa = mkaguzi_makosa + 1; + } } gn = ast_nne[gn]; } @@ -183,6 +194,9 @@ N32 mkaguzi_angalia(N32 mzizi) { kama (muundo_count < 1024) { muundo_nodes[muundo_count] = node; muundo_count = muundo_count + 1; + } sivyo { + andika_stderr("KOSA: akiba ya nodi za miundo (muundo_nodes) imejaa (kikomo 1024) — graph ya husisha ina aina za muundo nyingi mno\n"); + mkaguzi_makosa = mkaguzi_makosa + 1; } } node = ast_nne[node]; @@ -242,6 +256,9 @@ W0 mkaguzi_sajili_kazi(N32 kazi_node) { kama (kazi_param_enc_wapi < 4096) { kazi_param_enc[kazi_param_enc_wapi] = ast_thamani[p]; kazi_param_enc_wapi = kazi_param_enc_wapi + 1; + } sivyo { + andika_stderr("kosa [%s]: jedwali la aina za hoja bapa (kazi_param_enc) limejaa (kikomo 4096) — mradi una hoja nyingi mno kwa jumla, kwenye kazi zote\n", jina); + mkaguzi_makosa = mkaguzi_makosa + 1; } pc = pc + 1; p = ast_kulia[p]; @@ -283,6 +300,9 @@ W0 mkaguzi_sajili_kazi(N32 kazi_node) { kazi_ret_jina_off[kazi_ret_idadi] = off; kazi_ret_aina[kazi_ret_idadi] = ast_thamani[kazi_node]; kazi_ret_idadi = kazi_ret_idadi + 1; + } sivyo { + andika_stderr("kosa [%s]: jedwali la aina za kurudi za kazi (kazi_ret_idadi) limejaa (kikomo 1024) — mradi una kazi nyingi mno\n", jina); + mkaguzi_makosa = mkaguzi_makosa + 1; } } diff --git a/msingi/mkusanyaji/msambazaji.swa b/msingi/mkusanyaji/msambazaji.swa index 8bc3d11..d5edf92 100644 --- a/msingi/mkusanyaji/msambazaji.swa +++ b/msingi/mkusanyaji/msambazaji.swa @@ -121,7 +121,14 @@ muundo Msambazaji { // ------------------------------------------------------- N32 node_mpya(N32 aina, N32 thamani, N32 kushoto, N32 kulia) { kama (ast_idadi >= 1048576) { - andika_stderr("; DEB: HITILAFU node_mpya imefurika! idadi=%d aina=%d\n", ast_idadi, aina); + // MUHIMU: kama muundo_nodes[1024] (#189) na kazi_jina_pool[131072] + // (#197), dimbwi hili ni jedwali linaloendana na UKUBWA WA MRADI — + // faili kubwa la kweli (mfano Dominion) huweza kulifikia. Wito + // huu unarudisha -1 KWA MAKUSUDI (badala ya kuandika nje ya + // mipaka), LAKINI waitaji wengi wa node_mpya() bado hawaangalii + // matokeo haya kabla ya kuyatumia kama faharisi ya AST -- angalia + // lugha-swa/swa#199 kwa maelezo kamili ya hatari hii. + andika_stderr("KOSA: akiba ya nodi za AST (ast_aina/ast_thamani/...) imejaa (idadi=%d, aina ya nodi iliyoshindwa=%d) — chanzo (baada ya kutatua husisha zote) ni kikubwa mno kwa kikomo cha 1048576\n", ast_idadi, aina); rudisha -1; } N32 idx = ast_idadi; @@ -2242,6 +2249,8 @@ N32 changanua_muundo(Msambazaji* p) { muundo_ukubwa_jina[muundo_ukubwa_idadi] = ast_pool + ast_jina_off[name]; muundo_ukubwa_val[muundo_ukubwa_idadi] = running_offset; muundo_ukubwa_idadi = muundo_ukubwa_idadi + 1; + } sivyo { + andika_stderr("KOSA: akiba ya ukubwa wa miundo (muundo_ukubwa_jina/val) imejaa (kikomo 1024) — muundo '%s' na zinazofuata hazitapata ukubwa sahihi\n", ast_pool + ast_jina_off[name]); } rudisha mnode; } diff --git a/msingi/mkusanyaji/uzalishaji.swa b/msingi/mkusanyaji/uzalishaji.swa index 0ac9503..f34fb32 100644 --- a/msingi/mkusanyaji/uzalishaji.swa +++ b/msingi/mkusanyaji/uzalishaji.swa @@ -1165,6 +1165,8 @@ W0 andika_rela_ulimwengu(N32 urekebishaji_idx) { rela_nje_id[rela_idadi] = -1; // alama: sio nje rela_ulimwengu_idx[rela_idadi] = urekebishaji_idx; rela_idadi = rela_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la urekebishaji (rela_*) limejaa (kikomo 65536) — anwani hii haitarekebishwa sahihi\n"); } } @@ -1738,6 +1740,8 @@ W0 lebo_hifadhi(N8* jina, N32 ret_enc) { lebo_nafasi[lebo_idadi] = bafa_text_wapi; lebo_ret_enc[lebo_idadi] = ret_enc; lebo_idadi = lebo_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la lebo za kazi (lebo_*) limejaa (kikomo 2048) kwenye kazi '%s' — mradi una kazi nyingi mno\n", jina); } } @@ -2243,6 +2247,7 @@ N32 pata_au_unda_nje(N8* jina) { nje_idadi = nje_idadi + 1; rudisha nje_idadi - 1; } + andika_stderr("KOSA: jedwali la alama za nje (nje_*) limejaa (kikomo 2048) kwa alama '%s'\n", jina); rudisha -1; } @@ -2284,6 +2289,9 @@ N32 kusanya_herufi(N8* raw) { } // Ongeza mpya — badilisha utorokaji wakati wa kunakili + kama (str_idadi >= 1024 || str_buf_wapi + len + 1 >= 16384) { + andika_stderr("KOSA: jedwali la mfuatano halisi (str_*) limejaa (kikomo cha idadi 1024, au bafa ya baiti 16384) — mfuatano huu hautahifadhiwa sahihi\n"); + } kama (str_idadi < 1024 && str_buf_wapi + len + 1 < 16384) { N32 o = str_buf_wapi; N32 j = 0; // faharisi ya chanzo @@ -2735,6 +2743,12 @@ W0 uzalishaji_wito(N32 node, N32 kazi_node) { kama (ast_aina[a] == 45) { hoja_enc[hoja_idadi] = ast_nne[a]; } // HALISI_D: enc iko ast_nne kama (ast_aina[a] == 4) { hoja_enc[hoja_idadi] = ast_nne[a]; } // AST_NAMBARI: enc iko ast_nne (thamani iko ast_thamani) hoja_idadi = hoja_idadi + 1; + } sivyo { + // Ulinzi wa ziada: mkaguzi.swa tayari inakataa wito wenye + // hoja zaidi ya 16 kabla ya kufika hapa (kikomo hiki cha 32 + // hakipaswi kufikiwa kwa kawaida) -- kama ujumbe huu + // umeonekana, njia ya ukaguzi imepitwa mahali fulani. + andika_stderr("KOSA: bafa ya hoja za wito (hoja_nodes/hoja_enc) imejaa (kikomo 32) — hii haipaswi kutokea, mkaguzi anapaswa kuwa amekataa wito huu tayari\n"); } a = ast_tiga[a]; // hoja inayofuata kupitia ast_tiga } @@ -2977,6 +2991,8 @@ W0 uzalishaji_wito(N32 node, N32 kazi_node) { rela_text_off[rela_idadi] = bafa_text_wapi; rela_nje_id[rela_idadi] = nje_id; rela_idadi = rela_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la urekebishaji (rela_*) limejaa (kikomo 65536) — wito wa '%s' hautarekebishwa sahihi\n", callee); } andika_neno4(0); } @@ -3570,6 +3586,8 @@ W0 uzalishaji_achilia(N32 node, N32 kazi_node) { rela_text_off[rela_idadi] = bafa_text_wapi; rela_nje_id[rela_idadi] = nje_id; rela_idadi = rela_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la urekebishaji (rela_*) limejaa (kikomo 65536) — wito wa 'free' hautarekebishwa sahihi\n"); } andika_neno4(0); } @@ -3591,6 +3609,8 @@ W0 uzalishaji_badili(N32 node, N32 kazi_node) { rela_text_off[rela_idadi] = bafa_text_wapi; rela_nje_id[rela_idadi] = nje_id; rela_idadi = rela_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la urekebishaji (rela_*) limejaa (kikomo 65536) — wito wa 'realloc' hautarekebishwa sahihi\n"); } andika_neno4(0); } @@ -4399,6 +4419,10 @@ W0 uzalishaji_anwani_ya(N32 node, N32 kazi_node) { andika_neno4(0); rudisha; } + // MUHIMU: bila ujumbe huu, `&jina_la_kazi` ingekuwa 0 (null) + // KIMYA badala ya anwani halisi — tofauti na kuruka usajili tu + // (kama majedwali mengine), hapa msimbo WA UONGO unazalishwa. + andika_stderr("KOSA: jedwali la anwani za kazi (anwani_kazi_*) limejaa (kikomo 512) kwa '&%s' — anwani itakuwa 0 (null) kimakosa\n", jina); andika_xor_eax_eax(); rudisha; } @@ -5462,6 +5486,9 @@ W0 uzalishaji_kuu(N32 mzizi, N32 hali_exe) { // 0b. Kusanya vigezo vya ulimwengu (pre-scan) N32 gn = ast_kushoto[mzizi]; wakati (gn != -1) { + kama (ast_aina[gn] == 35 && data_ulimwengu_idadi >= 1024) { // AST_TANGAZO_ULIMWENGU + andika_stderr("KOSA: jedwali la data la ulimwengu (data_ulimwengu_*) limejaa (kikomo 1024) — kigezo hiki cha ulimwengu hakitatolewa sahihi\n"); + } kama (ast_aina[gn] == 35 && data_ulimwengu_idadi < 1024) { // AST_TANGAZO_ULIMWENGU N32 name_n = ast_kushoto[gn]; N32 enc = ast_thamani[gn]; // usimbaji wa aina (sasa umejaa!) @@ -5593,6 +5620,8 @@ W0 uzalishaji_kuu(N32 mzizi, N32 hali_exe) { anwani_data_pos[anwani_data_idadi] = bafa_data_wapi; anwani_data_jina[anwani_data_idadi] = ast_pool + ast_jina_off[val]; anwani_data_idadi = anwani_data_idadi + 1; + } sivyo { + andika_stderr("KOSA: jedwali la anwani za data (anwani_data_*) limejaa (kikomo 512)\n"); } N32 k = 0; wakati (k < 8) {