メインコンテンツにスキップ

leaf_call_must_not_return_handle

FFI のリーフ呼び出しでは 'Handle' を返すことはできません。

説明

#

Pointer.asFunction または DynamicLibrary.lookupFunction のいずれかの呼び出しで isLeaf 引数の値が true で、返される関数が Handle 型の戻り値型を持つ場合に、アナライザーはこの診断を生成します。

また、Native アノテーションの isLeaf 引数の値が true で、アノテーションの型引数が Handle を戻り値型とする関数型である場合にも、アナライザーはこの診断を生成します。

これらのすべてのケースにおいて、リーフ呼び出しは boolintfloatdouble、および戻り値型としての void の型のみでサポートされています。

FFI の詳細については、dart:ffi を使用した C の相互運用 を参照してください。

#

次のコードは、関数 pHandle を返しますが、isLeaf 引数が true であるため、この診断を生成します。

dart
import 'dart:ffi';

void f(Pointer<NativeFunction<Handle Function()>> p) {
  p.asFunction<Object Function()>(isLeaf: true);
}

一般的な修正

#

関数がハンドルを返す場合は、isLeaf 引数を削除してください。

dart
import 'dart:ffi';

void f(Pointer<NativeFunction<Handle Function()>> p) {
  p.asFunction<Object Function()>();
}

関数がサポートされている型のいずれかを返す場合は、型情報を修正してください。

dart
import 'dart:ffi';

void f(Pointer<NativeFunction<Int32 Function()>> p) {
  p.asFunction<int Function()>(isLeaf: true);
}