[GHC] #8427: GHC accepts invalid program because of EPS poisoning

GHC ghc-devs
Wed Oct 9 15:50:33 UTC 2013


#8427: GHC accepts invalid program because of EPS poisoning
-------------------------------------+-------------------------------------
       Reporter:  errge              |             Owner:
           Type:  bug                |            Status:  new
       Priority:  normal             |         Milestone:
      Component:  Compiler           |           Version:  7.6.3
       Keywords:                     |  Operating System:  Unknown/Multiple
   Architecture:  Unknown/Multiple   |   Type of failure:  GHC accepts
     Difficulty:  Moderate (less     |  invalid program
  than a day)                        |         Test Case:
     Blocked By:                     |          Blocking:
Related Tickets:                     |
-------------------------------------+-------------------------------------
 Assume the following setup:
   - compiling in batch mode (`--make`),
   - package klassz, module Class contains the class "Class a" and the data
 "Data",
   - package klassz, module A contains an (orphan) instance "Class Data",
   - package main, module AImporter just imports A,
   - package main, module B imports only Class, but uses the instance
 (invalidly);

 then
   - if package main, module Main imports B, later imports AImporter; then
 it compiles;
   - if package main, module Main imports AImporter, later imports B, then
 it doesn't compile.

 The attached tgz contains this setup.  `diff -u main-docompile main-
 nocompile` shows that the only difference between the two main directories
 is the order of import statements.  The language definitely doesn't accept
 compilation success to depend on import ordering, therefore this is a bug.

 My current understanding is that the issue is that this code should never
 compile, both mains should be rejected, since module B imports only the
 class, but not the instance.

 The issue is that the EPS is only ever increased, never decreased between
 compilation of different modules in a single batch compilation.  This
 na?ve approach causes the instances to be loaded and then never unloaded,
 so it can be magically found when compiling the invalid B module.

 The current code can be found in [[GhcFile(compiler/iface/LoadIface.hs)]]
 line 280.

 I propose to instead of always loading ifaces into the EPS directly,
 introduce a proper cache for interfaces, that contains parsed up interface
 data in a `ModuleEnv`.  Then we can start up with an empty EPS at the
 beginning of the compilation of every unit and quickly merge info from
 this cache.  I guess the majority of time is the file reading IO and the
 parsing, not the merging of multiple interface files together.

 I also think that these kind of issues will get more and more prominent as
 people start to use parallel cabal and ghc, because if compilation of the
 attached example program is randomly parallelized, then in some cases it
 will build, some cases it won't.

 Any opinions, alternative fix ideas?

--
Ticket URL: <http://ghc.haskell.org/trac/ghc/ticket/8427>
GHC <http://www.haskell.org/ghc/>
The Glasgow Haskell Compiler



More information about the ghc-tickets mailing list