mbraceproject / FsPickler

A fast multi-format message serializer for .NET
http://mbraceproject.github.io/FsPickler/
MIT License
324 stars 52 forks source link

Stack overflow serializing `MethodInfo` #78

Closed sylvanc closed 7 years ago

sylvanc commented 7 years ago

When attempting to serialize MethodInfo (or a delegate or an FSharpFunc derived from one), FsPickler seems to overflow the stack. Here's a minimal reproduction:

#r "packages/FsPickler/lib/net45/FsPickler.dll"

open System.Reflection
open MBrace.FsPickler

type A = DummyType

let explode (m: MethodInfo) =
  let serializer = FsPickler.CreateBinarySerializer()
  serializer.Pickle(m)

let f (s: string) = s

let test () =
  let mi = typeof<A>.DeclaringType.GetMethod("f")
  explode mi

test ()

Stack trace:

  at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 195                  
   at MBrace.FsPickler.ReflectionPicklers.memberInfoWriter@79.Invoke(WriteState w, String _arg3, MemberInfo m) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\ReflectionPicklers.fs:
line 130                                                                                                                                                                                                      
   at MBrace.FsPickler.CompositePickler`1.Write(WriteState state, String tag, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\Pickler\CompositePickler.fs:line 218                  
   at MBrace.FsPickler.RootSerialization.writeRootObject[T](IPicklerResolver resolver, ReflectionCache reflectionCache, IPickleFormatWriter formatter, FSharpOption`1 streamingContext, FSharpOption`1 sifter,
 Boolean isHash, Boolean disableSubtypes, Pickler`1 pickler, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\FsPickler\RootSerialization.fs:line 46                                 
   --- End of inner exception stack trace ---                                                                                                                                                                 
   at MBrace.FsPickler.RootSerialization.writeRootObject[T](IPicklerResolver resolver, ReflectionCache reflectionCache, IPickleFormatWriter formatter, FSharpOption`1 streamingContext, FSharpOption`1 sifter,
 Boolean isHash, Boolean disableSubtypes, Pickler`1 pickler, T value) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\FsPickler\RootSerialization.fs:line 50                                 
   at MBrace.FsPickler.FsPicklerSerializer.Serialize[T](Stream stream, T value, FSharpOption`1 pickler, FSharpOption`1 streamingContext, FSharpOption`1 encoding, FSharpOption`1 leaveOpen) in C:\Users\eirik.
tsarpalis\devel\mbrace\FsPickler\src\FsPickler\FsPickler\Serializer.fs:line 62                                                                                                                                
   at <StartupCode$FsPickler>.$Serializer.Pickle@155.Invoke(T v) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickler\FsPickler\Serializer.fs:line 155                                            
   at MBrace.FsPickler.FsPicklerSerializer.Pickle[T](T value, FSharpOption`1 pickler, FSharpOption`1 streamingContext, FSharpOption`1 encoding) in C:\Users\eirik.tsarpalis\devel\mbrace\FsPickler\src\FsPickl
er\FsPickler\Serializer.fs:line 155                                                                                                                                                                           
   at <StartupCode$FSI_0002>.$FSI_0002.main@() in c:\Users\syclebsc\dev\fstest\explode.fsx:line 36                                                                                                            
Stopped due to error
eiriktsarpalis commented 7 years ago

Hi, I cannot reproduce on the master branch. What version of FsPickler are you using?

dsyme commented 7 years ago

Sylvan's offline, but I'd imagine whatever you get with latest vagabond paket

sylvanc commented 7 years ago

Yes, I picked it up with paket: FsPickler 3.2.0.

eiriktsarpalis commented 7 years ago

@sylvanc I can't reproduce with the 3.2 release either. Are you running/loading any additional code/assemblies apart from that minimal reproduction? Also, could you please provide the exception message?

dsyme commented 7 years ago

I'll close this since we've lost the context by which to provide the extra information required