#16042·helix

Core Dump (corrupted size vs. prev_size) when opening Haskell file

Author: DawidLoubserCreated Jul 15, 2026Updated Sep 17, 2026
LabelsC-bug

Summary

Upon opening a (very small) Haskell source file - with or without a Haskell LSP running - Helix crashes instantly without initialising the TUI with corrupted size vs. prev_size Core Dump.

I attach detailed steps to reproduce, and a verbose log file, below.

Reproduction Steps

I tried the following with both the latest compiled-from source version (helix 25.07.1 (14d6bc0f)) as well as the latest stable version in the Arch Linux extra package (25.07.1-2).

  1. Use exercism to check out a simple Haskell exercise (xercism download --track=haskell --exercise=nucleotide-count)
  2. Open the file for editing, upon which Helix immediately crashes before drawing the TUI
$ hx src/DNA.hs
corrupted size vs. prev_size
Aborted                    (core dumped) hx src/DNA.hs

I can confirm that:

  1. It's not the Haskell LSP crashing, if I run it manually with haskell-language-server-wrapper --lsp it starts and runs fine
  2. If I create a custom config to disable any LSP for Haskell files, the behaviour is the same - instant crash with core dump.

Helix log

2026-07-15T14:03:01.060 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("docker-bake")] 2026-07-15T14:03:01.060 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.060 regex_cursor::engines::meta::strategy [DEBUG] skipping literal extraction since regex is anchored 2026-07-15T14:03:01.060 regex_cursor::engines::meta::wrappers [DEBUG] PikeVM built 2026-07-15T14:03:01.061 regex_cursor::engines::meta::wrappers [DEBUG] fully compiled forward and reverse DFAs built, 1968 bytes 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] skipping lazy DFA because we have a full DFA 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] skipping reverse anchored optimization because the regex is also anchored at the start 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] using core strategy 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("sl")] 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("sl")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("sl")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("kcl")] 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("kcl")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("kcl")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(2), exact=true) extracted before optimization: Seq[E("hx"), E("haxe")] 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(2), exact=true) extracted after optimization: Seq[E("hx"), E("haxe")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 2 literals: [E("hx"), E("haxe")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.061 globset [DEBUG] built glob set; 3 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("basic")] 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("basic")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("basic")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("freebasic")] 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("freebasic")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("freebasic")] 2026-07-15T14:03:01.061 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("sgf")] 2026-07-15T14:03:01.061 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("sgf")] 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("sgf")] 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.062 globset [DEBUG] built glob set; 1 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] skipping literal extraction since regex is anchored 2026-07-15T14:03:01.062 regex_cursor::engines::meta::wrappers [DEBUG] PikeVM built 2026-07-15T14:03:01.062 regex_cursor::engines::meta::wrappers [DEBUG] fully compiled forward and reverse DFAs built, 4784 bytes 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] skipping lazy DFA because we have a full DFA 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] skipping reverse anchored optimization because the regex is also anchored at the start 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] using core strategy 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] skipping literal extraction since regex is anchored 2026-07-15T14:03:01.062 regex_cursor::engines::meta::wrappers [DEBUG] PikeVM built 2026-07-15T14:03:01.062 regex_cursor::engines::meta::wrappers [DEBUG] fully compiled forward and reverse DFAs built, 1520 bytes 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] skipping lazy DFA because we have a full DFA 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] skipping reverse anchored optimization because the regex is also anchored at the start 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] using core strategy 2026-07-15T14:03:01.062 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("klg")] 2026-07-15T14:03:01.062 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("klg")] 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("klg")] 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.062 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("styx")] 2026-07-15T14:03:01.062 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("styx")] 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("styx")] 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.062 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(4), exact=true) extracted before optimization: Seq[E("Tiltfile"), E("Tilt"), E("tiltfile"), E("tilt")] 2026-07-15T14:03:01.062 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(4), exact=true) extracted after optimization: Seq[E("Tiltfile"), E("Tilt"), E("tiltfile"), E("tilt")] 2026-07-15T14:03:01.062 regex_cursor::engines::meta::strategy [DEBUG] creating prefilter from 4 literals: [E("Tiltfile"), E("Tilt"), E("tiltfile"), E("tilt")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::wrappers [DEBUG] PikeVM built 2026-07-15T14:03:01.063 regex_cursor::engines::meta::wrappers [DEBUG] fully compiled forward and reverse DFAs built, 2052 bytes 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] skipping lazy DFA because we have a full DFA 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] skipping reverse anchored optimization because the regex is not always anchored at the end 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] using core strategy 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("gnuplot")] 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("gnuplot")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("gnuplot")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("ebnf")] 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("ebnf")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("ebnf")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.063 globset [DEBUG] built glob set; 2 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("proverif")] 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("proverif")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("proverif")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("ptx")] 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("ptx")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("ptx")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("tql")] 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("tql")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("tql")] 2026-07-15T14:03:01.063 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.063 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(2), exact=true) extracted before optimization: Seq[E("moonbit"), E("mbt")] 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(2), exact=true) extracted after optimization: Seq[E("moonbit"), E("mbt")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 2 literals: [E("moonbit"), E("mbt")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.064 globset [DEBUG] built glob set; 1 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("concerto")] 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("concerto")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("concerto")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("puppet")] 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("puppet")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("puppet")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("p")] 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("p")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("p")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("xwiki")] 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("xwiki")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("xwiki")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("varlink")] 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("varlink")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("varlink")] 2026-07-15T14:03:01.064 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(2), exact=true) extracted before optimization: Seq[E("mm"), E("metamath")] 2026-07-15T14:03:01.064 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(2), exact=true) extracted after optimization: Seq[E("mm"), E("metamath")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 2 literals: [E("mm"), E("metamath")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.065 globset [DEBUG] built glob set; 1 literals, 0 basenames, 0 extensions, 0 prefixes, 0 suffixes, 0 required extensions, 0 regexes 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(3), exact=true) extracted before optimization: Seq[E("cmd"), E("batch"), E("bat")] 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(3), exact=true) extracted after optimization: Seq[E("cmd"), E("batch"), E("bat")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] creating prefilter from 3 literals: [E("cmd"), E("batch"), E("bat")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::wrappers [DEBUG] PikeVM built 2026-07-15T14:03:01.065 regex_cursor::engines::meta::wrappers [DEBUG] fully compiled forward and reverse DFAs built, 2052 bytes 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] skipping lazy DFA because we have a full DFA 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] skipping reverse anchored optimization because the regex is not always anchored at the end 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] using core strategy 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("html")] 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("html")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("html")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("json")] 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted after optimization: Seq[E("json")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] trying to bypass regex engine by creating prefilter from 1 literals: [E("json")] 2026-07-15T14:03:01.065 regex_cursor::engines::meta::strategy [DEBUG] found that the regex can be broken down to a literal search, avoiding the regex engine entirely 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DEBUG] prefixes (len=Some(1), exact=true) extracted before optimization: Seq[E("css")] 2026-07-15T14:03:01.065 regex_cursor::util::prefilter [DE