[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