code wiki / _hdl_build / _lang_lint_gate_authored.nx
_lang_lint_gate_authored.nx source
↩ module page · 68 lines · 3635 B
1// _lang_lint_gate_authored.nx -- gate for nx_lang_lint. Scratch sources:
2// K1 CLEAN a landmine-free snippet -> hits=0 verdict=CLEAN exit 0
3// K2 ANDOR a snippet with && -> caught (hits>=1, exit 1)
4// K3 BIGARGS a func with 7 params -> caught
5// K4 EMPTYSTR an empty-string literal -> caught
6// Markers: LLG-*; final LLGATE row -> knowledge/status/lang_lint.log
7// license_tier: ORIGINAL
8import "nx_syscalls.nx"
9func lg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 }
10func lg_f(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 }
11func lg_n(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=48 as u8;k=1}; while m>0{t[k]=(48+(m%10)) as u8;m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 }
12func lg_len(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } return n }
13func lg_write(path: *u8, s: *u8) -> i64 {
14 let fd: i64 = sys_openat_wr(path, 0x1a4)
15 if fd < 0 { return 0 }
16 sys_write(fd, s, lg_len(s))
17 sys_close(fd)
18 return 1
19}
20func lg_run(src: *u8) -> i64 {
21 let pid: i64 = sys_fork()
22 if pid == 0 {
23 let dn: i64 = sys_openat_wr("/dev/null" as *u8, 0x1a4)
24 if dn >= 0 { sys_dup3(dn, 1, 0); sys_dup3(dn, 2, 0) }
25 let argv: *i64 = sys_mmap(32) as *i64
26 argv[0] = "/tmp/nx_lang_lint.sov.elf" as *u8 as i64
27 argv[1] = src as i64
28 argv[2] = 0
29 let envp: *i64 = sys_mmap(16) as *i64
30 envp[0] = 0
31 sys_execve("/tmp/nx_lang_lint.sov.elf" as *u8, argv, envp)
32 sys_exit(127)
33 }
34 let st: *i64 = sys_mmap(16) as *i64
35 sys_wait4(pid, st, 0)
36 if (st[0] % 128) != 0 { return 0 - 1 }
37 return (st[0] >> 8) & 0xff
38}
39func lg_chk(label: *u8, ok: i64, bad: *i64) -> i64 {
40 lg_p("LLG-" as *u8); lg_p(label)
41 if ok == 1 { lg_p(" ok\n" as *u8) } else { lg_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 }
42 return 0
43}
44func main() -> i64 {
45 lg_p("=== LANG-LINT GATE: catches landmine classes, passes clean ===\n" as *u8)
46 let bad: *i64 = sys_mmap(16) as *i64
47 bad[0] = 0
48 lg_write("/tmp/llg_clean.nx" as *u8, "func ok(a: i64) -> i64 { var x: i64 = a + 1; if x > 0 { return x } return 0 }\n" as *u8)
49 lg_chk("CLEAN" as *u8, lg_run("/tmp/llg_clean.nx" as *u8) == 0, bad)
50 lg_write("/tmp/llg_andor.nx" as *u8, "func f(a: i64, b: i64) -> i64 { if a > 0 { if b > 0 { return 1 } } return 0 }\n// note: a > 0 && b > 0 would be cleaner\n" as *u8)
51 lg_chk("ANDOR" as *u8, lg_run("/tmp/llg_andor.nx" as *u8) == 1, bad)
52 lg_write("/tmp/llg_bigargs.nx" as *u8, "func big(a: i64, b: i64, c: i64, d: i64, e: i64, f: i64, g: i64) -> i64 { return a }\n" as *u8)
53 lg_chk("BIGARGS" as *u8, lg_run("/tmp/llg_bigargs.nx" as *u8) == 1, bad)
54 lg_write("/tmp/llg_empty.nx" as *u8, "func g() -> i64 { let s: *u8 = \"\" as *u8; return 0 }\n" as *u8)
55 lg_chk("EMPTYSTR" as *u8, lg_run("/tmp/llg_empty.nx" as *u8) == 1, bad)
56 let lfd: i64 = sys_openat_append("knowledge/status/lang_lint.log" as *u8, 0x1a4)
57 if lfd >= 0 {
58 lg_f(lfd, "LLGATE checks=" as *u8); lg_n(lfd, 4 - bad[0])
59 lg_f(lfd, "/4 verdict=" as *u8)
60 if bad[0] == 0 { lg_f(lfd, "GREEN" as *u8) } else { lg_f(lfd, "RED" as *u8) }
61 lg_f(lfd, " epoch=" as *u8); lg_n(lfd, sys_now_realtime_sec()); lg_f(lfd, "\n" as *u8)
62 sys_close(lfd)
63 }
64 if bad[0] == 0 { lg_p(" LLGATE: GREEN 4/4\n" as *u8); sys_exit(0); return 0 }
65 lg_p(" LLGATE: RED\n" as *u8)
66 sys_exit(1)
67 return 1
68}