Skip to content

[Impeller] iOS crashed with SIGABRT when ClipPath is used #120220

@Azhng

Description

@Azhng

Steps to Reproduce

  1. Enable impeller
  2. flutter run

Expected results:

App runs.

Actual results:

App crashed with SIGABRT coming from thread #10, name = 'io.flutter.1.raster'

Crash happens on iPhone 13, iPhone 14 Pro.
Crash did not happen on iPhone 11 Pro / iPhone 12 Pro.

Code sample

We were not able to create a minimum example, however, we have identified that removing the ClipPath widget from our widget tree prevents the crash from happening.

Clipper

Clipper:

class _MyClipper extends CustomClipper<Path> {
  final Size clipSize;

  const _MyClipper({
    required this.clipSize,
  });

  @override
  Path getClip(Size size) {
    return Path.combine(
      PathOperation.difference,
      Path()..addRect(Rect.fromLTWH(0, 0, size.width, size.height)),
      Path()
        ..addRect(
          Rect.fromCenter(
            center: Offset(size.width / 2, size.height / 2),
            width: clipSize.width,
            height: clipSize.height,
          ),
        )
        ..close(),
    );
  }

  @override
  bool shouldReclip(CustomClipper<Path> oldClipper) => false;
}
Stack(
  children: [
    ClipPath(
        clipper: _TargetOverlay(
          clipSize: Size(
            450 / 4 * 3 * 0.8,
            450 * 0.8,
          ),
        ),
        // Background image
        child: Image.memory(Uint8List.fromList(
            _image!))),
  ],
Logs
[        ] * thread #10, name = 'io.flutter.1.raster', stop reason = signal SIGABRT
[        ]   * frame #0: 0x0000000215793674 libsystem_kernel.dylib`__pthread_kill + 8
[        ]     frame #1: 0x0000000225ef71ac libsystem_pthread.dylib`pthread_kill + 268
[        ]     frame #2: 0x00000001df2f4c8c libsystem_c.dylib`abort + 180
[        ]     frame #3: 0x0000000106fff37c Flutter`std::_LIBCPP_ABI_NAMESPACE::__throw_bad_optional_access[abi:v15000]() + 12
[        ]     frame #4: 0x0000000107493784 Flutter`impeller::ClipContents::GetStencilCoverage(impeller::Entity const&, std::_LIBCPP_ABI_NAMESPACE::optional<impeller::TRect<float> > const&) const + 364
[        ]     frame #5: 0x00000001074e2fb0 Flutter`impeller::EntityPass::OnRender(impeller::ContentContext&, impeller::TSize<long long>, impeller::RenderTarget const&, impeller::TPoint<float>, impeller::TPoint<float>, unsigned int, unsigned long, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<impeller::Contents>) const::$_0::operator()(impeller::Entity&) const + 188
[        ]     frame #6: 0x00000001074e24d4 Flutter`impeller::EntityPass::OnRender(impeller::ContentContext&, impeller::TSize<long long>, impeller::RenderTarget const&, impeller::TPoint<float>, impeller::TPoint<float>, unsigned int, unsigned long, std::_LIBCPP_ABI_NAMESPACE::shared_ptr<impeller::Contents>) const + 2920
[        ]     frame #7: 0x000000010748b72c Flutter`impeller::AiksContext::Render(impeller::Picture const&, impeller::RenderTarget&) + 476
[        ]     frame #8: 0x00000001075233b8 Flutter`std::_LIBCPP_ABI_NAMESPACE::__function::__func<fml::internal::CopyableLambda<flutter::GPUSurfaceMetalImpeller::AcquireFrame(SkISize const&)::$_0>, std::_LIBCPP_ABI_NAMESPACE::allocator<fml::internal::CopyableLambda<flutter::GPUSurfaceMetalImpeller::AcquireFrame(SkISize const&)::$_0> >, bool (flutter::SurfaceFrame&, SkCanvas*)>::operator()(flutter::SurfaceFrame&, SkCanvas*&&) + 668
[        ]     frame #9: 0x000000010741b814 Flutter`flutter::SurfaceFrame::Submit() + 84
[        ]     frame #10: 0x000000010735469c Flutter`flutter::Rasterizer::DrawToSurfaceUnsafe(flutter::FrameTimingsRecorder&, flutter::LayerTree&) + 1276
[        ]     frame #11: 0x0000000107355160 Flutter`std::_LIBCPP_ABI_NAMESPACE::__function::__func<flutter::Rasterizer::DrawToSurface(flutter::FrameTimingsRecorder&, flutter::LayerTree&)::$_6, std::_LIBCPP_ABI_NAMESPACE::allocator<flutter::Rasterizer::DrawToSurface(flutter::FrameTimingsRecorder&, flutter::LayerTree&)::$_6>, void ()>::operator()() + 28
[        ]     frame #12: 0x00000001072626ec Flutter`fml::SyncSwitch::Execute(fml::SyncSwitch::Handlers const&) const + 72
[        ]     frame #13: 0x0000000107354040 Flutter`flutter::Rasterizer::DrawToSurface(flutter::FrameTimingsRecorder&, flutter::LayerTree&) + 272
[        ]     frame #14: 0x00000001073560e4 Flutter`std::_LIBCPP_ABI_NAMESPACE::__function::__func<flutter::Rasterizer::Draw(std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::Pipeline<flutter::LayerTreeItem> > const&, std::_LIBCPP_ABI_NAMESPACE::function<bool (flutter::LayerTree&)>)::$_2, std::_LIBCPP_ABI_NAMESPACE::allocator<flutter::Rasterizer::Draw(std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::Pipeline<flutter::LayerTreeItem> > const&, std::_LIBCPP_ABI_NAMESPACE::function<bool (flutter::LayerTree&)>)::$_2>, void (std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::LayerTreeItem, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::LayerTreeItem> >)>::operator()(std::_LIBCPP_ABI_NAMESPACE::unique_ptr<flutter::LayerTreeItem, std::_LIBCPP_ABI_NAMESPACE::default_delete<flutter::LayerTreeItem> >&&) + 312
[        ]     frame #15: 0x00000001073553ac Flutter`flutter::Rasterizer::Draw(std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::Pipeline<flutter::LayerTreeItem> > const&, std::_LIBCPP_ABI_NAMESPACE::function<bool (flutter::LayerTree&)>) + 460
[        ]     frame #16: 0x000000010736aed4 Flutter`std::_LIBCPP_ABI_NAMESPACE::__function::__func<fml::internal::CopyableLambda<flutter::Shell::OnAnimatorDraw(std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::Pipeline<flutter::LayerTreeItem> >)::$_12>, std::_LIBCPP_ABI_NAMESPACE::allocator<fml::internal::CopyableLambda<flutter::Shell::OnAnimatorDraw(std::_LIBCPP_ABI_NAMESPACE::shared_ptr<flutter::Pipeline<flutter::LayerTreeItem> >)::$_12> >, void ()>::operator()() + 368
[        ]     frame #17: 0x0000000107260ea8 Flutter`fml::MessageLoopImpl::FlushTasks(fml::FlushType) + 568
[        ]     frame #18: 0x0000000107264a48 Flutter`fml::MessageLoopDarwin::OnTimerFire(__CFRunLoopTimer*, fml::MessageLoopDarwin*) + 32
[        ]     frame #19: 0x00000001d7d3d32c CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_TIMER_CALLBACK_FUNCTION__ + 32
[        ]     frame #20: 0x00000001d7cf99a8 CoreFoundation`__CFRunLoopDoTimer + 940
[        ]     frame #21: 0x00000001d7c9d548 CoreFoundation`__CFRunLoopDoTimers + 288
[        ]     frame #22: 0x00000001d7ceafa0 CoreFoundation`__CFRunLoopRun + 1896
[        ]     frame #23: 0x00000001d7cefeb0 CoreFoundation`CFRunLoopRunSpecific + 612
[        ]     frame #24: 0x0000000107264b34 Flutter`fml::MessageLoopDarwin::Run() + 88
[        ]     frame #25: 0x0000000107263c28 Flutter`void* std::_LIBCPP_ABI_NAMESPACE::__thread_proxy[abi:v15000]<std::_LIBCPP_ABI_NAMESPACE::tuple<std::_LIBCPP_ABI_NAMESPACE::unique_ptr<std::_LIBCPP_ABI_NAMESPACE::__thread_struct, std::_LIBCPP_ABI_NAMESPACE::default_delete<std::_LIBCPP_ABI_NAMESPACE::__thread_struct> >, fml::Thread::Thread(std::_LIBCPP_ABI_NAMESPACE::function<void (fml::Thread::ThreadConfig const&)> const&, fml::Thread::ThreadConfig const&)::$_0> >(void*) + 208
[        ]     frame #26: 0x0000000225ef16cc libsystem_pthread.dylib`_pthread_start + 148

$ flutter doctor -v                                                                            [13:07:17]
[✓] Flutter (Channel stable, 3.7.1, on macOS 13.2 22D49 darwin-arm64, locale en-CA)
    • Flutter version 3.7.1 on channel stable at /Users/archerzhang/src/github.com/flutter
    • Upstream repository [email protected]:flutter/flutter.git
    • Framework revision 7048ed95a5 (6 days ago), 2023-02-01 09:07:31 -0800
    • Engine revision 800594f1f4
    • Dart version 2.19.1
    • DevTools version 2.20.1

[✓] Android toolchain - develop for Android devices (Android SDK version 33.0.0)
    • Android SDK at /Users/archerzhang/Library/Android/sdk
    • Platform android-33, build-tools 33.0.0
    • Java binary at: /Applications/Android Studio.app/Contents/jre/Contents/Home/bin/java
    • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)
    • All Android licenses accepted.

[✓] Xcode - develop for iOS and macOS (Xcode 14.2)
    • Xcode at /Applications/Xcode.app/Contents/Developer
    • Build 14C18
    • CocoaPods version 1.11.3

[✓] Chrome - develop for the web
    • Chrome at /Applications/Google Chrome.app/Contents/MacOS/Google Chrome

[✓] Android Studio (version 2021.3)
    • Android Studio at /Applications/Android Studio.app/Contents
    • Flutter plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/9212-flutter
    • Dart plugin can be installed from:
      🔨 https://plugins.jetbrains.com/plugin/6351-dart
    • Java version OpenJDK Runtime Environment (build 11.0.13+0-b1751.21-8125866)

[✓] VS Code (version 1.71.2)
    • VS Code at /Applications/Visual Studio Code.app/Contents
    • Flutter extension version 3.50.0

[✓] Connected device (3 available)
    • exotic eridanus (mobile) • 00008110-001038A20269801E • ios            • iOS 16.3 20D47
    • macOS (desktop)          • macos                     • darwin-arm64   • macOS 13.2 22D49
      darwin-arm64
    • Chrome (web)             • chrome                    • web-javascript • Google Chrome 109.0.5414.119

[✓] HTTP Host Availability
    • All required HTTP hosts are available

• No issues found!

Metadata

Metadata

Assignees

Labels

P0Critical issues such as a build break or regressione: impellerImpeller rendering backend issues and features requestsengineflutter/engine related. See also e: labels.

Type

No type

Projects

Relationships

None yet

Development

No branches or pull requests

Issue actions