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}