Lowent 매뉴얼←↑→

부록 B — 진단 찾아보기

앞의 두 표는 이 책의 예제가 실제로 일으킨 진단이다. 예제에는 안 나오지만 만날 수 있는 진단은 맨 끝 «그 밖의 진단» 에 모았다. 코드는 판이 바뀌어도 같은 뜻을 지킨다. 진단의 긴 영문 설명과 고치는 법은 컴파일러가 그 자리에서 말한다(--diag-json 은 기계가 읽는 꼴로).

번역할 때#

코드뜻보이는 곳
E-ACCESS-MODEaccess 로 적은 읽기·쓰기 약속을 몸이 어긴다27장
E-ACTOR-FIELD액터의 상태 칸을 바깥에서 읽는다25장
E-ACTOR-STATE-REF액터 상태 칸에 빌림을 둔다25장
E-ACTOR-UNINIT갓 띄운 액터의 슬라이스 칸을 세우기 전에 읽는다20장
E-ALLOC-AMBIGUOUS맞는 할당기가 둘 이상인데 using 으로 고르지 않았다20장
E-ALLOC-NESTED같은 뿌리의 안쪽 영역이 열린 채 바깥 출처로 깎았다18장
E-ALLOC-NOCAPalloc 을 적었는데 할당 권한을 받지 않았다16장
E-ALLOC-NOSOURCE할당기를 쓰는 호출인데 이 op 안에 맞는 할당기가 하나도 없다20장
E-ALLOC-OUTLIVES영역의 바이트를 영역 밖에서 태어난 액터에게 건넨다18장
E-ALLOC-SHARED원자적이지 않은 할당기를 태스크에 건넨다26장
E-ALLOC-TASK뿌리에서 깎는 op 을 태스크로 띄운다26장
E-ALLOC-USING-UNUSED할당기를 쓰지 않는 호출에 using 을 적었다20장, 34장
E-ASM-TARGET-UNKNOWNasm 절의 기계 이름이 대상 목록에 없다30장
E-ASM-UNBOUND어셈블리 템플릿이 선언하지 않은 피연산자를 부른다30장
E-ATOMIC-NOCAPatomic 을 적었는데 cap atomic 을 받지 않았다27장
E-ATOMIC-ORDER그 원자 연산에 뜻이 없는 기억 차례다27장
E-BLOCK-UNCLOSEDdo 로 연 블록을 end 로 닫지 않았다2장
E-BOUND-UNSAT타입 인자가 요구한 트레이트를 갖추지 못했다22장, 23장
E-BRAND-REUSED같은 브랜드로 저장소를 두 번 열었다35장
E-CAP-FORGE권한 칸을 가진 액터를 그 권한 없이 띄운다16장, 20장, 25장
E-CAP-KIND다른 종류의 권한을 건넸다16장
E-CAP-LOCAL받은 권한을 지역 이름에 옮겨 담았다16장
E-CAP-MISSING권한이 필요한 내장 연산에 권한을 첫 피연산자로 적지 않았다16장
E-CHAR이 언어에 없는 글자(기호)다6장, 7장, 8장, 9장
E-CHAR-WIDTH글자 리터럴이 글자 하나가 아니다3장
E-CLAUSE-ORDERop 머리의 절이 정해진 차례를 어겼다2장, 3장, 22장
E-COMPTIME-ARGcomptime 자리에 실행 값을 주었다22장
E-CONC-ALONE묶음이 흐름 하나만 만들고 그 흐름이 짝을 기다린다26장
E-CONC-DEADLOCK묶인 흐름이 모두 받기만 하고 아무도 보내지 않는다26장
E-CONFIG-TYPE구성이 손잡이의 선택지에 없는 값을 준다31장
E-CONFIG-UNDEF선언하지 않은 빌드 손잡이를 구성이나 config 가 부른다31장
E-CONTRACT-DEADrequires 가 이미 배제한 오류를 선언했다14장
E-CONTRACT-IMPOSSIBLE상수끼리의 호출이 상대의 requires 를 어긴다14장, 35장
E-CONTRACT-UNSAT함께 참일 수 없는 전제 둘14장
E-DEP-MISSINGuse … from 의 자리에서 파일을 읽을 수 없다21장
E-EFFECT선언하지 않은 효과를 낸다15장, 20장, 26장
E-EFFECT-CALC순수한 fn 이 효과를 낸다1장, 5장, 15장, 16장, 18장, 24장
E-EFFECT-DUP효과 줄에 같은 원자를 두 번 적었다15장, 44장
E-EFFECT-NO-CAPio 따위를 적었는데 허락하는 권한이 없다2장, 16장
E-EFFECT-NONE-MIXnone 을 다른 효과와 함께 적었다15장
E-EFFECT-PURITYfn 이 호출자나 액터가 볼 수 있는 상태에 쓴다5장, 15장, 25장
E-EFFECT-REDUNDANTfn 에 effects none 을 적었다5장
E-EFFECT-UNDEF목록에 없는 효과 낱말이다15장, 44장
E-ENS-UNDEFensures 가 없는 이름을 가리킨다 — 돌려주는 값은 ret14장
E-ENTRY-PARAMS시작점이 권한 아닌 입력을 받는다16장
E-ENUM-DOT열거의 갈래를 마침표로 닫지 않았다10장
E-ENUM-INFINITE갈래가 자기 타입을 값으로 품는다10장
E-ERR-UNDECLAREDerrors 절에 없는 오류를 돌려준다11장
E-ERRORS-STATEerrors 조건이 액터의 상태 칸을 읽는다25장
E-ESCAPE지역을 가리키는 참조가 op 밖으로 나간다12장
E-EXCL같은 값에 대한 빌림이 겹친다12장, 20장, 26장, 43장
E-EXPR-APPexpr 섬 안의 부름을 괄호로 묶지 않았다8장
E-EXPR-CHAINexpr 섬에서 비교를 이어 썼다3장
E-EXPR-UNARYexpr 섬에 단항 연산자를 썼다8장
E-FFI-LINKextern op 이 부를 씨 심볼을 적지 않았다29장
E-FFI-NOCAPC 를 부르는데 cap c 를 받지 않았다29장
E-FFI-NOEFFECTC 를 부르는 op 에 효과 줄이 없다29장
E-FFI-NOUNSAFEC 를 부르는데 unsafe 표시가 없다29장
E-FFI-TYPEC ABI 가 표현할 수 없는 타입이 경계를 건넌다29장
E-FIELD-GLUED값 뒤에 점을 붙여 칸을 읽으려 했다 — field 로 적는다3장
E-FN-CAP되부름으로 넘길 op 이 권한을 요구한다29장
E-FN-NOTEXPORTunsafe_fn 이 export extern 이 아닌 op 을 가리킨다29장
E-FOLD-OPpipe 스테이지가 없는 op 을 부른다24장
E-FOLD-ORDERfold 단계 op 의 누산값 자리가 결과 타입과 다르다24장
E-GROUP-UNCLOSED괄호가 닫히지 않았다3장
E-GUARD-FALLTHROUGHguard 의 else 가 떠나지 않는다7장
E-HEAP-NOHOST운영체제 없는 대상에서 자라는 뿌리를 청한다18장
E-IF-VALUEif 를 값으로 썼다6장
E-IMMUTABLElet 으로 지은 이름에 set 했다6장
E-IR-ARITYop 을 인자 수가 맞지 않게 불렀다5장, 48장
E-IR-UNDEF그 자리에서 알 수 없는 이름이다6장, 7장, 21장, 22장, 25장
E-ISR-CALLED인터럽트 처리기를 코드에서 불렀다30장
E-ISR-EFFECT인터럽트 처리기가 effects device 를 적지 않았다30장
E-ISR-PARAMS인터럽트 처리기가 매개변수를 받는다30장
E-LET-NOVALUEbe 뒤에 값이 없다6장
E-LOCK-NOTYET흐름끼리 나누는 자물쇠 타입은 아직 짓지 않았다26장
E-MATCH-INEXHAUSTIVEmatch 가 모든 경우를 덮지 않는다7장, 10장
E-MATCH-REDUNDANTmatch 의 갈래가 영영 돌지 않는다(_ 뒤의 갈래·겹친 범위)11장
E-METHOD-RECV붙은 op 의 수신자가 첫 입력이 아니다23장
E-METHOD-UNDEF수신자의 타입에 그 이름의 붙은 op 이 없다22장, 23장
E-MMIO-BYVALUE레지스터 묶음을 값으로 받는다30장
E-MMIO-PERM읽기 전용 레지스터에 쓴다30장
E-MONO-NOTYPE제네릭 부름에 앞자리 타입 인자가 없다22장
E-MREF-SLICEmut ref slice 를 썼다12장
E-NAME-BUILTIN내장 op 의 이름을 선언이나 지역 이름으로 썼다5장, 6장
E-NAME-DUP한 모듈에 같은 이름을 두 번 선언했다21장
E-NAME-SCOPE블록 안에서 지은 이름을 블록 밖에서 읽는다6장
E-NAME-SHADOW살아 있는 이름을 다시 지었다(가림)3장, 6장
E-OPT-UNUSED선언한 빌드 손잡이를 아무 코드도 읽지 않는다31장
E-OWN-INCOMPLETE완결이 필요한 값을 끝내지 않고 버린다19장, 28장, 36장
E-OWN-JOIN갈래마다 소유 상태가 다르다19장
E-OWN-MOVED옮긴 값을 다시 쓴다19장, 25장, 28장, 35장, 36장
E-PAR-ASSOC모으는 연산이 결합적이지 않다27장
E-PAR-CARRY나누는 되풀이가 걸음을 넘어 사는 자리에 쓴다27장
E-PAR-FLOAT부동소수 누적을 나누어 모으려 했다27장
E-PAR-IDENTITYreduce 의 시작값이 그 연산의 항등원이 아니다27장
E-PAR-NOLOOPparallel 절이 나눌 되풀이를 찾지 못했다27장
E-PAR-READ나누는 되풀이가 남의 원소를 읽는다27장
E-PAR-WRITE나누는 되풀이가 남의 원소에 쓴다27장, 45장
E-PIPE-NO-TERMINAL종결자 뒤에 스테이지가 온다24장
E-PIPE-STAGEpipe 스테이지 목록에 없는 낱말이다24장
E-PROFILE-LEVEL빌드 프로파일이 주지 않는 동시성을 쓴다25장
E-REGION-ESCAPE영역에서 얻은 바이트를 밖으로 들고 나간다18장
E-RETURN-PARTIAL어떤 길에서 값을 돌려주지 않는다3장, 5장, 7장
E-SPAWN-SCOPEtask_group 밖에서 흐름을 만든다26장
E-STMT-ELSEelse 가 블록 안에 있다7장
E-TIER-EFFECT선언한 기계 등급이 감당하지 못하는 효과다30장
E-TOPLEVEL최상위에 올 수 없는 것이 최상위에 있다3장
E-TRAIT-EFFECT갖춘 op 이 서명보다 많은 효과를 가진다23장
E-TRAIT-MISSING트레이트의 op 하나가 없다23장
E-TRAIT-SIG서명에 fn·proc 을 적었거나 매개변수 수가 다르다23장
E-TRY-NORESULTtry 를 썼는데 이 op 은 그 오류를 돌려줄 수 없다11장
E-TYPE-ARG인자의 타입이 매개변수와 맞지 않는다12장
E-TYPE-ARGMUT읽기만 되는 값을 고치는 자리에 넘긴다(let 을 mut_ref 로)9장, 12장
E-TYPE-ARRAYarray 의 길이를 타입 뒤에 적었다9장
E-TYPE-BITCASTbit_cast 의 목표가 모든 비트열이 값인 타입이 아니다20장
E-TYPE-COLLECTcollect into 가 넓은 값을 좁은 그릇에 담는다24장
E-TYPE-COND조건 자리에 참거짓이 아닌 값이 왔다4장
E-TYPE-DECL타입 선언에 be 를 끼웠다13장
E-TYPE-FIELD구조체를 만들 때 칸이 빠졌거나 없는 칸을 적었다10장
E-TYPE-INSTANCE같은 제네릭의 서로 다른 인스턴스를 섞었다35장
E-TYPE-KIND그 연산에 쓸 수 없는 갈래의 타입이다(예: bool 을 cast)8장, 10장, 13장
E-TYPE-MIX부동소수와 정수 리터럴을 섞어 셈한다4장
E-TYPE-MUTmut 이 아닌 슬라이스의 원소에 쓴다9장
E-TYPE-NOMINAL표현이 같아도 이름이 다른 타입을 섞었다13장
E-TYPE-REF읽기 참조로 쓴다12장
E-TYPE-REFVAL참조를 값처럼 썼다12장
E-TYPE-RETURN돌려주는 값이 op 의 출력 타입과 다르다11장, 31장
E-TYPE-SIGN값을 지키는 넓히기가 없는 부호 섞기다4장, 39장, 40장
E-TYPE-WIDTH값이 선언된 타입에 들어가지 않는다3장, 4장, 13장
E-UNSAFE-UNDECLAREDunsafe 효과를 적었는데 op 에 unsafe 표시가 없다29장
E-VEC-SPLATsplat 을 식 안에 바로 적었다27장
E-VISIBILITY다른 모듈의 감춘 이름에 닿는다21장
E-VOCAB-REMOVED없앤 낱말이나 철자다3장, 5장, 7장, 15장, 48장
E-WIDEN-SIGN부호 있는 수를 부호 없는 타입으로 widen 했다13장
W-EFFECT-OVER선언만 하고 내지 않는 효과다(경고)15장, 16장
W-EXPORT-HIDDEN내보낸 서명이 감춘 타입을 쓴다21장
W-NOT-YET이름은 받지만 아직 뜻이 없는 낱말을 썼다13장
W-USE-EXTERNAL번역 단위에 없는 모듈을 들여온다(경고)32장

표 50.1 — 예제가 보이는 진단

실행 중에 멈출 때#

코드뜻보이는 곳
E-VM-OVERFLOW정수가 선언된 폭에서 넘쳤다4장
E-VM-DIV00 으로 나누었다4장
E-VM-CAST좁히기·cast 의 값이 목표 타입에 들어가지 않는다4장
E-VM-SHIFT옮기는 칸 수가 폭 이상이다4장
E-VM-BOUNDS색인이 범위 밖이다9장
E-VM-NONE없는 값을 꺼냈다11장
E-VM-CONTRACT계약(requires·ensures·errors·범위)이 깨졌다14장
E-VM-PANICpanic 을 불렀다7장
E-VM-ANALYSIS지운 검사의 자리가 실제로 범위 밖이다(컴파일러 결함)40장
E-TEST-FAIL시험의 expect 가 거짓이다31장

표 50.2 — 실행 중의 진단

그 밖의 진단#

예제에는 나오지 않지만 쓰다 보면 만날 수 있는 진단이다. 대부분은 --run 으로 돌릴 때 VM(실행기) 이 멈추며 낸다. VM 은 시험과 대조를 위한 실행기라 자원을 고정된 크기로 잡아 두고, 그 한도를 넘으면 조용히 틀린 값을 내는 대신 멈춘다. 한도는 프로그램의 결함이 아니라 VM 의 크기이므로, 같은 프로그램을 네이티브로 지으면 대개 문제없이 돈다.

코드뜻과 고치는 법
E-IR-EXTRAexpr 섬 뒤에 남는 피연산자가 있다 — 섬은 식 하나로 끝난다. 괄호로 묶거나 줄을 나눈다
E-IR-LIMIT한 번역 단위의 op 이 도구가 나를 수 있는 수보다 많다 — 모듈을 나눈다
E-IR-LOCALS한 op 의 지역 이름이 너무 많다 — op 을 쪼갠다
E-MONO-FIXPOINT제네릭 단형화가 끝나지 않는다(타입이 계속 자란다) — 스스로를 더 큰 타입으로 부르는 제네릭을 끊는다
W-COL0맨 위 선언이 0 열에서 시작하지 않는다 — 들여쓰기가 틀려 앞 선언의 몸에 들어간 줄일 수 있다
W-UNBOUND이름 붙인 contract 를 선언했는데 어느 op 도 satisfies 로 쓰지 않는다
W-RFC-PENDING설계가 아직 RFC 단계인 기능을 썼다 — 프로그램에 고칠 것은 없다
W-CBE-SLOW이 op 이 네이티브에서 느린 길(태그 값)로 낮춰진다 — 까닭은 --why-slow 가 op 마다 말한다

표 50.3 — 번역할 때 — 예제에 없는 것

코드뜻과 고치는 법
E-VM-ERR오류인 result 에서 ok_value 로 값을 꺼냈다 — 먼저 is_ok 로 묻거나 try 로 넘긴다
E-VM-DANGLING빌린 참조가 그 자리의 수명보다 오래 쓰였다(돌려준 뒤에 씀)
E-VM-EXCL한 자리를 쓰는 빌림과 다른 빌림이 겹쳐 쓰였다 — 먼저 빌린 것을 끝내고 다음을 빌린다
E-VM-READONLY읽기 전용 참조(ref)로 썼다 — 쓰려면 mut_ref 로 빌린다
E-VM-FIELD레코드 · 레지스터 블록에 없는 칸을 읽었다
E-VM-AWAITawait 에 작업 핸들이 아닌 값을 주었다 — 핸들은 spawn <op> 이 준다
E-VM-CHAN-EMPTY · E-VM-CHAN-FULL빈 채널에서 받거나 찬 채널에 보냈는데, 기다려 줄 스케줄러가 없다 — 영영 풀리지 않는 대기다
E-VM-SCHED-LOOP핸들러가 서로 메시지를 끝없이 주고받아 스케줄러가 멈추지 못한다
E-VM-FD · E-VM-FMODE · E-VM-FWHENCE쓸 수 없는 파일 번호(1 · 2 만 쓴다) · 없는 열기 방식(0 · 1 · 2) · 없는 seek 기준(0 · 1 · 2)
E-VM-FHANDLE · E-VM-SHANDLE · E-VM-REACTOR열린 파일 · 소켓 · 리액터 핸들이 아닌 값을 넘겼다
E-VM-EXTERN몸이 C 에 있는 extern op 을 VM 에서 불렀다 — 네이티브로 지어서 돌린다
E-VM-MMIO · E-VM-RESERVE절대 주소의 레지스터 블록 · 링커가 주는 저장소를 VM 에서 열었다 — 실제 기계에서만 뜻이 있다

표 50.4 — 실행 중에 — 프로그램의 잘못

코드무엇이 다 찼나
E-VM-STACK · E-VM-DEPTH · E-VM-OOM피연산자 스택 · 호출 깊이 · 호출 스택을 키울 메모리 — 재귀가 너무 깊다
E-VM-BOXPOOL · E-VM-RECPOOL · E-VM-STKPOOL · E-VM-BSETPOOLsome·ok 로 감싼 값 · 구조체 값 · 스택 컨테이너 · 비트셋을 담는 풀 — 한꺼번에 살아 있는 값을 줄인다
E-VM-CHAN · E-VM-MBOX채널 64 개 · 비동기 우편함 4096 칸 — 다시 쓰지 않으므로 한 실행에서 그만큼만 만든다
E-VM-FILEPOOL · E-VM-SOCKPOOL동시에 열 수 있는 파일 · 소켓 수 — 다 쓴 것을 닫는다
E-VM-CHAIN-LIMITVM 안에서 VM 을 부르는 겹침이 너무 깊다
E-VM-BUDGET대조(오라클) 실행의 걸음 예산을 다 썼다 — 평소 --run 에서는 나지 않는다

표 50.5 — 실행 중에 — VM 의 한도(프로그램의 결함이 아니다)