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 진단에 대한 설명이에요.

출처: FFI leaf call can't return a '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 문서를 참고해 주세요.

예시

다음 코드는 함수 pHandle을 반환하는데 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);
}

더 알아보기