Skip to content

Conversation

@pkova
Copy link
Collaborator

@pkova pkova commented Jun 18, 2025

No description provided.

joemfb and others added 29 commits May 19, 2025 11:03
These issues came up while testing #812 under Asan and Ubsan. The +bex
jet had already been partially fixed in #764. There are many more of
these undefined left shifts in the codebase. Those should be
systematically rectified, maybe as part of #794.
`u3k()` / `u3a_gain()` asserts that a noun reference is not `u3_none`,
while `u3z()` / `u3a_lose()` does not. Neither needs -- they will both
safely no-op given `u3_none` (due to the `..._is_normal()` conditions
inside their implementation functions). The inconsistency here makes for
inconsistent code -- the presence of `u3z(u3_none)` may indicate
misconceived refcount handling.

This PR does not resolve the overall issue. It just corrects a couple
cases by removing unneeded refcount operations and notes another.
Currently, if Nock bytecode interpreter executes an autocons and does
not need the subject to be left on top of the stack (e.g. tail
position), it would delay losing it after running both the head and the
tail formulas, and only lose them when consing the results.

This PR reduces the memory usage by allowing the tail formula to consume
the subject if it is not needed, losing it sooner.
This PR fixes a longstanding bug in hashtable road promotion, wherein
null slots in table root struct would dereferenced as posts and
reallocated, causing unnecessary "traversal" and extra, unused memory
allocation.
These changes were developed on top of #812, as part of a(nother) failed
effort to develop leak-free unification of senior memory. But they stand
alone, and deserve separate review.

This PR fixes a bug wherein deeper addresses were not preferred when
unifying two nouns on the same road. It also optimizes the unification
implementation by using separate functions for normal and senior
unification and removing branches. Finally, it enables home-road
unification when the current road is the home road and there are no
child roads, and adds basic unit tests for these scenarios.
Reverts #827

This PR causes an instant segfault in the serf after upgrading on
`~dinleb-rambep`, `~norsyr-torryn` and probably all pre-existing ships.
The segfault has the following stacktrace:

```
urbit 3.4-0969b6de10
boot: home is /root/dinleb-rambep
disk: loaded epoch 0i575532513
loom: mapped 2048MB
boot: protected loom
live: mapped: GB/1.945.878.528
live: loaded: KB/16.384
boot: installed 1362 jets
loom: image backup complete
disk: created epoch 575532513
loom: mapped 2048MB
lite: arvo formula 4ce68411
lite: core 641296f
lite: final state 641296f
disk: loaded epoch 0i575532513
loom: mapped 2048MB
boot: protected loom
live: mapped: GB/1.945.878.528
live: loaded: KB/16.384
boot: installed 1362 jets
vere: checking version compatibility
loom: external fault: 0 (0x200000000 : 0x280000000)

Breakpoint 1, u3m_fault (adr_v=0x0, ser_i=<optimized out>) at pkg/noun/manage.c:1967
1967	pkg/noun/manage.c: No such file or directory.
(gdb) bt
#0  u3m_fault (adr_v=0x0, ser_i=<optimized out>) at pkg/noun/manage.c:1967
#1  0x00000000014b9544 in sigsegv_handler (sig=<optimized out>, sip=<optimized out>, ucp=0x1840b40 <Sigstk+6896>) at /home/runner/.cache/zig/p/N-V-__8AAHQhHwCCMyKUtQhO0AMsY182In-wQIwXVhenOql5/src/handler-unix.c:269
#2  <signal handler called>
#3  _n_burn (pog_u=0x1ffffe121ffffe5a, bus=<optimized out>, mov=1 '\001', off=-1 '\377') at pkg/noun/nock.c:2100
#4  0x0000000001273653 in _n_burn_out (bus=1950065936, pog_u=0x1fffffff4) at pkg/noun/nock.c:2814
#5  _n_burn_on (bus=1950065936, bus@entry=3460980861, fol=<optimized out>) at pkg/noun/nock.c:2837
#6  u3n_nock_on (bus=1950065936, bus@entry=3460980861, fol=<optimized out>) at pkg/noun/nock.c:2851
#7  0x0000000001271938 in u3v_poke_raw (sam=50403342) at pkg/noun/vortex.c:293
#8  u3v_poke (ovo=ovo@entry=3459182210) at pkg/noun/vortex.c:285
#9  0x0000000001262948 in u3m_soft_top (mil_w=mil_w@entry=0, pad_w=pad_w@entry=1048576, fun_f=0x12718d0 <u3v_poke>, arg=3459182210) at pkg/noun/manage.c:1311
#10 0x00000000012630ad in u3m_soft (mil_w=4294967284, mil_w@entry=0, fun_f=0x1d0ee947, arg=1950064560) at pkg/noun/manage.c:1577
#11 0x000000000161888d in _serf_poke (sef_u=<optimized out>, cap_c=<optimized out>, mil_w=0, job=job@entry=3455400141) at pkg/vere/serf.c:556
#12 0x0000000001617804 in _serf_work (sef_u=0x183ec20 <u3V>, mil_w=0, job=3455400141) at pkg/vere/serf.c:604
#13 u3_serf_work (sef_u=sef_u@entry=0x183ec20 <u3V>, mil_w=mil_w@entry=0, job=3455400141) at pkg/vere/serf.c:692
#14 0x0000000001618666 in u3_serf_writ (sef_u=0x183ec20 <u3V>, wit=3462698097, pel=pel@entry=0x7fffffff9a0c) at pkg/vere/serf.c:1160
#15 0x000000000126141d in _cw_serf_writ (vod_p=<optimized out>, len_d=113, byt_y=0x7ffff7ff8780 "\001\377\356Mn\235\001\b") at pkg/vere/main.c:1079
#16 0x00000000014ddf08 in _newt_meat_poke (mot_u=0x183ed90 <inn_u>, met_u=0x7ffff7ff8770) at pkg/vere/newt.c:62
#17 _newt_meat_next_sync (mot_u=0x183ed90 <inn_u>) at pkg/vere/newt.c:75
#18 _newt_read_sync_cb (str_u=0x183ed90 <inn_u>, len_i=<optimized out>, buf_u=<optimized out>) at pkg/vere/newt.c:236
#19 0x00000000014ccfe7 in uv__read (stream=0x183ed90 <inn_u>) at /home/runner/.cache/zig/p/N-V-__8AAH34QwB6wi5eQK_lFbfDGSN3hRE8l-6Ep198ZsGg/src/unix/stream.c:1148
#20 uv__stream_io (loop=<optimized out>, w=0x183ee18 <inn_u+136>, events=1) at /home/runner/.cache/zig/p/N-V-__8AAH34QwB6wi5eQK_lFbfDGSN3hRE8l-6Ep198ZsGg/src/unix/stream.c:1208
#21 0x00000000014c6b94 in uv__io_poll (loop=loop@entry=0x1864148 <default_loop_struct>, timeout=-1) at /home/runner/.cache/zig/p/N-V-__8AAH34QwB6wi5eQK_lFbfDGSN3hRE8l-6Ep198ZsGg/src/unix/linux.c:1565
#22 0x00000000014c31f1 in uv_run (loop=loop@entry=0x1864148 <default_loop_struct>, mode=mode@entry=UV_RUN_DEFAULT) at /home/runner/.cache/zig/p/N-V-__8AAH34QwB6wi5eQK_lFbfDGSN3hRE8l-6Ep198ZsGg/src/unix/core.c:460
#23 0x000000000125e791 in _cw_serf_commence (argc=<optimized out>, argv=<optimized out>) at pkg/vere/main.c:1299
#24 _cw_utils (argc=argc@entry=11, argv=argv@entry=0x7fffffffdf08) at pkg/vere/main.c:3250
#25 0x000000000125c7d9 in main (argc=11, argv=0x7fffffffdf08) at pkg/vere/main.c:3275
```

@Quodss @joemfb
Added Check of +.feed to make sure its a cell, if its a cell and a moon
we crash before running

`+veri:dawn`

Resolves #818
@pkova pkova requested a review from a team as a code owner June 18, 2025 18:00
@pkova pkova merged commit b5639dd into next/kelvin/409 Jun 18, 2025
2 checks passed
@pkova pkova deleted the pkova/mergeman branch June 18, 2025 18:56
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants