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