[GHC] #8854: Missing class method not caught at compile time, program freezes when missing method is called.
GHC
ghc-devs at haskell.org
Thu Mar 6 20:31:37 UTC 2014
#8854: Missing class method not caught at compile time, program freezes when
missing method is called.
----------------------------------+----------------------------------
Reporter: RaminHAL9001 | Owner:
Type: bug | Status: new
Priority: normal | Milestone:
Component: Compiler | Version: 7.6.3
Keywords: | Operating System: Linux
Architecture: x86_64 (amd64) | Type of failure: Runtime crash
Difficulty: Unknown | Test Case:
Blocked By: | Blocking:
Related Tickets: #7633 |
----------------------------------+----------------------------------
I created a type class where two of four functions must be satisfied for a
minimal complete definition. GHC did not catch an instance where the
minimal complete definition was not satisfied, the program compiled
without an error or warning.
When running the compiled program it would freeze when calling the missing
method. Also when running the program in GHCi and stepping up to the use
of the missing method, GHCi would freeze before reaching the missing
function. This made it very difficult to debug. It '''did not''' throw a
"NoMethodError" exception, and there '''was no''' segment violation caught
by the operating system, nor does the program terminate with the
"<<loop>>" message output on the command line.
Compiling with language extensions:
{{{
-XTemplateHaskell -XScopedTypeVariables -XRankNTypes
-XMultiParamTypeClasses -XFunctionalDependencies -XFlexibleInstances
-XFlexibleContexts -XDeriveDataTypeable
}}}
Using compiler flags:
{{{
-prof -fprof-auto -threaded -Wall -fno-warn-name-shadowing -fno-warn-
unused-do-bind -fno-warn-auto-orphans
}}}
'''To Reproduce the Issue'''
I tried to reproduce the issue with a miniature program that isolates the
problem, but GHC successfully detects a problem and terminates with the
"<<loop>>" message written on the command line. My program is much larger
and simply froze. However the code I wrote looks similar to the following
situation...
First I tried this, which gave me no problems at all:
{{{
class A x where
f1 :: x
f1 = f2
f2 :: x
f2 = f1
}}}
We have two functions f1 and f2, if f1 is not defined it defaults to f2,
if f2 is not defined it defaults to f1, so you must define either f1 or
f2, or you could also define both.
Then I add two more methods:
{{{
class A x where
f1 :: x
f1 = f2
f2 :: x
f2 = f1
g1 :: x
g1 = g2
g2 :: x
g2 = g1
}}}
Just like with f1 f2, the g1 g2 functions each use their counterpart to
define their default method. But this caused a huge problem.
The minimal complete definition should be (f1 | f2) & (g1 | g2), but the
compiler does not report any warning when I have not satisfied the minimal
complete definition. Maybe one of my compiler flags disabled a would-be
warning, I don't know yet. This was a red-flag to me, but I went on to
test my program.
As it turns out, there was a place in my code where I forgot to write an
instance for g1 or g2 but I had not realize it. I only found out when I
ran my test program and it froze. No "unsatisfied method" exception, not
segment violations, it just froze. Although the program was still running
and consuming a small amount of CPU resources, and I could cancel with
CTRL-C in the command line.
--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8854>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler
More information about the ghc-tickets
mailing list