Re: expose strlen from Foreign.C.String
Carter Schonwald <[email protected]>
| Newsgroups | gmane.comp.lang.haskell.libraries |
|---|---|
| Message-ID | <CAHYVw0zmi2FznYRx4nsPW_XtvfNQdK1_92U067NO5ezusgHYUA@mail.gmail.com> |
andrew! this is a really good point. would the with# or touch# combinators be needed to fix it (to force gc liveness?)? OR would we need to have the foreign c call defined to have an -> IO result, then use unsafePerformIO to "purefy it correctly"? i think the best way to explain *why* the proposed definition runs into trouble is to look at how we annotate delicate/complicated prims in primops are annotated https://gitlab.haskell.org/ghc/ghc/-/blob/4bb9a349b5d002463b9fc4e9a3b6dbf77ea7c085/compiler/GHC/Builtin/primops.txt.pp#L139-178 otoh, the last time i was playing with an ostensibly pure primop that had really delicate effect ordering, the prefetch stuff in the NCG, my conclusion was that it *needed* explicit state tokens to make sure it didn't get reordered, and for this primop that pure version would need to be via unsafeperformio i think On Fri, Jan 22, 2021 at 8:46 AM Andrew Martin <[email protected]> wrote: > This is unsound: > > x <- malloc ... > memcpy ... copy a nul-terminated string into x > let len = cstringLength x > free x > > Because GHC can float the let binding down to where it is used after free. > > Sent from my iPhone > > On Jan 21, 2021, at 7:45 PM, Zemyla <[email protected]> wrote: > > > That doesn't sound right. I don't think it allocates any data on the heap > which could cause reallocation and move an unpinned ByteArray#, which is > the only way I can think it would be unsafe. > > On Thu, Jan 21, 2021, 17:50 Andrew Martin <[email protected]> > wrote: > >> Both the unboxed variant and the wrapper are only sound on primitive >> string literals. You cannot use them on anything that was allocated at >> runtime, only on stuff baked into the rodata section. This is a pretty >> onerous restriction. What use case did you have in mind? >> >> Sent from my iPhone >> >> > On Jan 20, 2021, at 11:02 PM, Viktor Dukhovni <[email protected]> >> wrote: >> > >> > >> >> >> >>> On Jan 21, 2021, at 1:39 AM, chessai <[email protected]> wrote: >> >>> On Wed, Jan 20, 2021, 17:01 Viktor Dukhovni <[email protected]> >> wrote: >> >>>> On Wed, Jan 20, 2021 at 09:54:30AM -0800, chessai wrote: >> >>>> >> >>>> I've wanted the following before: >> >>>> >> >>>> foreign import ccall unsafe "strlen" >> >>>> cstringLength# :: Addr# -> Int# >> >>>> >> >>>> cstringLength :: CString -> Int >> >>>> cstringLength (Ptr s) = I# (cstringLength# s) >> >>>> >> >>>> A natural place for this seems to be Foreign.C.String. >> >>> >> >>> Why a new FFI call, rather than `cstringLength#` from ghc-prim: >> GHC.CString >> >>> (as of GHC 9.0.1): >> >> >> >> I forgot about that addition. In that case we would just need the >> lifted wrapper >> > >> > No worries, sure the lifted wrapper makes sense, and Foreign.C.String >> does >> > look like a reasonable place in which to define, and from which to >> export it. >> > >> > -- >> > Viktor. >> > >> > _______________________________________________ >> > Libraries mailing list >> > [email protected] >> > http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries >> _______________________________________________ >> Libraries mailing list >> [email protected] >> http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries >> > _______________________________________________ > Libraries mailing list > [email protected] > http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries > _______________________________________________ Libraries mailing list [email protected] http://mail.haskell.org/cgi-bin/mailman/listinfo/libraries