leaf_call_must_not_take_handle 진단: FFI leaf 호출과 Handle 매개변수
leaf_call_must_not_take_handle 진단: FFI leaf 호출과 Handle 매개변수
Dart 분석기가 만들어 내는 leaf_call_must_not_take_handle 진단에 대한 설명이에요.
본문
Handle 타입의 매개변수를 가지는 함수는 FFI leaf 호출로 사용할 수 없어요.
설명
Pointer.asFunction이나 DynamicLibrary.lookupFunction 호출에서 isLeaf 인자의 값이 true인데, 반환될 함수의 매개변수 타입이 Handle인 경우 분석기가 이 진단을 만들어요. FFI에 대한 더 자세한 내용은 C interop using dart:ffi 문서를 참고해 주세요.
예시
다음 코드는 함수 p가 Handle 타입의 매개변수를 갖는데 isLeaf 인자가 true이기 때문에 이 진단을 만들어요.
import 'dart:ffi';
void f(Pointer<NativeFunction<Void Function(Handle)>> p) {
p.asFunction<void Function(Object)>(isLeaf: true);
}
흔한 해결 방법
함수가 Handle 타입의 매개변수를 하나라도 갖고 있다면 isLeaf 인자를 제거하면 돼요.
import 'dart:ffi';
void f(Pointer<NativeFunction<Void Function(Handle)>> p) {
p.asFunction<void Function(Object)>();
}
함수의 매개변수 중 Handle이 하나도 없다면 타입 정보를 바로잡아 주면 돼요.
import 'dart:ffi';
void f(Pointer<NativeFunction<Void Function(Int8)>> p) {
p.asFunction<void Function(int)>(isLeaf: true);
}