[GHC] #13669: Identifier "Otherwise" in guarded equation can crash a program

GHC ghc-devs at haskell.org
Tue May 9 08:55:18 UTC 2017


#13669: Identifier "Otherwise" in guarded equation can crash a program
-------------------------------------+-------------------------------------
           Reporter:  vanto          |             Owner:  (none)
               Type:  feature        |            Status:  new
  request                            |
           Priority:  normal         |         Milestone:
          Component:  Compiler       |           Version:  8.0.2
           Keywords:                 |  Operating System:  Unknown/Multiple
       Architecture:                 |   Type of failure:  Other
  Unknown/Multiple                   |
          Test Case:                 |        Blocked By:
           Blocking:                 |   Related Tickets:
Differential Rev(s):                 |         Wiki Page:
-------------------------------------+-------------------------------------
 In GHC.Base the identifier {{{otherwise}}} is defined as the value "True"
 and it helps to make guards more readable.\\

 The identifier {{{otherwise}}} is not secure.\\

 We can change his property easily and trick the compiler.\\

 As written in GHC Base, {{{otherwise = True}}} is perfectible.\\

 The problem here is to protect the "otherwise" identifier from
 uncontrolled access.\\

 See the code below and the result of the compilation as well as the
 output.\\

 {{{
 import qualified Prelude as P

 otherwise :: P.Bool
 otherwise = P.False

 fun :: (P.Num a, P.Ord a) => a -> [P.Char]
 fun x | x P.< 0       = "down"
         | otherwise  = "up"

 main :: P.IO ()
 main = P.print (fun 7)

 c:\Sourcehs>ghc -Wall otherwise.hs
 [1 of 1] Compiling Main             ( otherwise.hs, otherwise.o )

 otherwise.hs:7:1: warning: [-Wincomplete-patterns]
     Pattern match(es) are non-exhaustive
     In an equation for `fun': Patterns not matched: _

 otherwise.hs:11:17: warning: [-Wtype-defaults]
     * Defaulting the following constraints to type `P.Integer'
         (P.Num a0) arising from a use of `fun' at otherwise.hs:11:17-21
         (P.Ord a0) arising from a use of `fun' at otherwise.hs:11:17-21
     * In the first argument of `P.print', namely `(fun 7)'
       In the expression: P.print (fun 7)
       In an equation for `main': main = P.print (fun 7)
 Linking otherwise.exe ...

 c:\Sourcehs>otherwise
 otherwise: otherwise.hs:(7,1)-(8,27): Non-exhaustive patterns in function
 fun

 }}}
 I propose three solutions:
  1- Delete {{{otherwise}}} from GHC.Base and use only TRUE.\\

  2- Add {{{otherwise}}} as a reserved word or keyword.\\

  3- Create protected objects in Haskell.

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


More information about the ghc-tickets mailing list