Dart Analyze logoDart Analyze/
DRT-W1458

FFI leaf call can't return a 'Handle'DRT-W1458

Major severityMajor
Bug Risk categoryBug Risk

The analyzer produces this diagnostic when the value of the isLeaf argument in an invocation of either Pointer.asFunction or DynamicLibrary.lookupFunction is true and the function that would be returned would have a return type of Handle.

The analyzer also produces this diagnostic when the value of the isLeaf argument in an FfiNative annotation is true and the type argument on the annotation is a function type whose return type is Handle.

In all of these cases, leaf calls are only supported for the types bool, int, float, double, and, as a return type void.

For more information about FFI, see C interop using dart:ffi.

Example

The following code produces this diagnostic because the function p returns a Handle, but the isLeaf argument is true:

import 'dart:ffi';

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

Common fixes

If the function returns a handle, then remove the isLeaf argument:

import 'dart:ffi';

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

If the function returns one of the supported types, then correct the type information:

import 'dart:ffi';

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