다음과 같은 문제가 발생했습니다(아래에 간략한 예시가 있습니다). 버그인가요, 아니면 제가 뭔가 놓친 건가요?
(윈도우 11, JMP 18.0)
다음 스크립트는 오류를 발생시키는 대신 JMP를 충돌시킵니다.
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
위와 대조적으로, 추적 플래그가 없으면 일반적으로 "thrown" 오류가 발생합니다.
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown" ) );
Return( "ok" )
);
Return( sub_f() )
);
f()
또한 Return()을 Try()에 넣어 충돌을 방지합니다.
Names Default To Here(1);
f = Function( {}, { sub_f },
sub_f = Function( {},
If( 1, Throw( "thrown", 1 ) );
Return( "ok" )
);
Try( Return( sub_f() ), Throw( "crash prevented" ) )
);
f()
JMP에서 버그를 발견하셨습니다. 이 스레드를 가리키는 보고서를 제출하겠습니다. sub_f의 로컬 변수를 주석 처리하면 문제를 해결할 수 있습니다.
f = Function( {}, // { sub_f },
(이 설명이 꽤 정확하다고 확신합니다...) JMP가 throw()를 잡을 때쯤이면 지역 변수는 소멸되고 추적 정보는 손실됩니다. 추적을 생성하는 코드는 이에 대비하지 못해 잘못된 메모리 참조로 인해 충돌이 발생합니다. 함수 내부에 try()를 추가하면 JMP가 함수 내부에서 throw()를 포착하고 지역 변수는 소멸되지 않습니다. 또는 함수를 전역 변수에 유지하는 방법도 있습니다.
편집: TS-00250890