
#15732: getArgsWithResponseFiles does not filter out RTS options -------------------------------------+------------------------------------- Reporter: ckoparkar | Owner: (none) Type: bug | Status: new Priority: normal | Milestone: 8.8.1 Component: libraries/base | Version: 8.6.1 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Incorrect result | Unknown/Multiple at runtime | Test Case: Blocked By: | Blocking: Related Tickets: #13896 | Differential Rev(s): Wiki Page: | -------------------------------------+------------------------------------- Description changed by ckoparkar: Old description:
I discovered this while working on a fix for #15072.
{{{GHC.ResponseFile.getArgsWithResponseFiles}}} is a recent addition to {{{base-4.12}}}. The idea was to have a function which could read command-line arguments supplied via response files, but otherwise would behave exactly like `System.Environment.getArgs` (see #13896). However, these functions return different results when RTS options are supplied. 1. {{{getArgs}}} does not include RTS options in the list it returns. 2. {{{getArgsWithResponseFiles}}} includes them.
It's trivial to reproduce this. Consider these files:
{{{ -- Bug1.hs module Main where
import System.Environment ( getArgs )
main :: IO () main = do args <- getArgs putStrLn $ "Args: " ++ show args }}}
and
{{{ -- Bug2.hs module Main where
import GHC.ResponseFile ( getArgsWithResponseFiles )
main :: IO () main = do args <- getArgsWithResponseFiles putStrLn $ "ArgsResp: " ++ show args }}}
And run them with:
{{{#!sh $ ghc-8.6.1 -rtsopts Bug1.hs && ghc-8.6.1 -rtsopts Bug2.hs
$ ./Bug1 1 +RTS -H32m -RTS 10 20 Args: ["1","10","20"]
-- 'opts_file' contains the same arguments passed to Bug1, and we -- use a '@' to pass it as a response file
$ ./Bug2 @opts_file ArgsResp: ["1","+RTS","-H32m","-RTS","10","20"] }}}
We should fix {{{getArgsWithResponseFiles}}} to properly handle {{{+RTS ... -RTS}}} and {{{--RTS}}} flags. Currently, {{{getArgs}}} relies on the [http://git.haskell.org/ghc.git/blob/HEAD:/rts/RtsFlags.c#l661 runtime system] for filtering out appropriate things.
New description: I discovered this while working on a fix for #15072. {{{GHC.ResponseFile.getArgsWithResponseFiles}}} is a recent addition to {{{base-4.12}}}. The idea was to have a function which could read command- line arguments supplied via response files, but otherwise would behave exactly like `System.Environment.getArgs` (see #13896). However, these functions return different results when RTS options are supplied. 1. {{{getArgs}}} does not include RTS options in the list it returns. 2. {{{getArgsWithResponseFiles}}} includes them. It's trivial to reproduce this. Consider these files: {{{ -- Bug1.hs module Main where import System.Environment ( getArgs ) main :: IO () main = do args <- getArgs putStrLn $ "Args: " ++ show args }}} and {{{ -- Bug2.hs module Main where import GHC.ResponseFile ( getArgsWithResponseFiles ) main :: IO () main = do args <- getArgsWithResponseFiles putStrLn $ "ArgsResp: " ++ show args }}} And run them with: {{{#!sh $ ghc-8.6.1 -rtsopts Bug1.hs && ghc-8.6.1 -rtsopts Bug2.hs $ ./Bug1 1 +RTS -H32m -RTS 10 20 Args: ["1","10","20"] -- 'opts_file' contains the same arguments passed to Bug1, and we -- use a '@' to pass it as a response file $ ./Bug2 @opts_file ArgsResp: ["1","+RTS","-H32m","-RTS","10","20"] }}} We should fix {{{getArgsWithResponseFiles}}} to properly handle {{{+RTS ... -RTS}}} and {{{--RTS}}} flags. {{{getArgs}}} relies on the [http://git.haskell.org/ghc.git/blob/HEAD:/rts/RtsFlags.c#l661 runtime system] for this. -- -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/15732#comment:1 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler