C# DataSafe - StackOverFlowExeption

0

im learning C# and i try to build a "DataSafe".

I got a StackOverflowExeption and i dont find a Solution for my Problem. Is there a way that Visual Studio Shows me the Exeption in Detail?

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Datensafe
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Geben Sie eine beliebige Zeichenkette ein: ");
            String input = Console.ReadLine();
            Safe safe = new Safe(input);
            Console.WriteLine(safe.Treasure);
            Console.ReadKey();
        }
    }

    class Safe
    {
        private string treasure;

        public Safe(String value)
        {
            Treasure = value;
        }

        public String Treasure
        {
            set { treasure = encrypt(value); }
            get { return decrypt(treasure); }
        }

        private string encrypt(string str)
        {
            byte[] bytes = System.Text.Encoding.Unicode.GetBytes(str);
            return Convert.ToBase64String(bytes);
        }

        private string decrypt(String encrypted)
        {
            byte[] bytes = Convert.FromBase64String(Treasure);
            return System.Text.Encoding.Unicode.GetString(bytes);

        }
    }
}

Could someone help me?

Here is the ErrorLog:

Process is terminated due to StackOverflowExeption

"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\assembly\GAC_MSIL\Microsoft.VisualStudio.HostingProcess.Utilities.Sync\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.HostingProcess.Utilities.Sync.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\assembly\GAC_MSIL\Microsoft.VisualStudio.Debugger.Runtime\12.0.0.0__b03f5f7f11d50a3a\Microsoft.VisualStudio.Debugger.Runtime.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "U:\Visual Studio 2013\Projects\Datensafe\Datensafe\bin\Debug\Datensafe.vshost.exe" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml.Linq\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.Linq.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Data.DataSetExtensions\v4.0_4.0.0.0__b77a5c561934e089\System.Data.DataSetExtensions.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\Microsoft.CSharp\v4.0_4.0.0.0__b03f5f7f11d50a3a\Microsoft.CSharp.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_32\System.Data\v4.0_4.0.0.0__b77a5c561934e089\System.Data.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll" geladen. Das Laden von Symbolen wurde übersprungen. Das Modul ist optimiert, und die Debugoption "Nur eigenen Code" ist aktiviert.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "C:\windows\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_de_b77a5c561934e089\mscorlib.resources.dll" geladen. Das Modul wurde ohne Symbole erstellt.
Der Thread 0x580 hat mit Code 259 (0x103) geendet.
Der Thread 0x2f4 hat mit Code 259 (0x103) geendet.
Der Thread 0xabc hat mit Code 0 (0x0) geendet.
Der Thread 0xa48 hat mit Code 259 (0x103) geendet.
"Datensafe.vshost.exe" (CLR v4.0.30319: Datensafe.vshost.exe): "U:\Visual Studio 2013\Projects\Datensafe\Datensafe\bin\Debug\Datensafe.exe" geladen. Symbole wurden geladen.
Das Programm "[864] Datensafe.vshost.exe" wurde mit Code -2147023895 (0x800703e9) beendet.
c#
string
asked on Stack Overflow Feb 12, 2016 by kicki

4 Answers

0

You are using Treasure property:

private string decrypt(String encrypted)
{
    byte[] bytes = Convert.FromBase64String(Treasure); // here
    return System.Text.Encoding.Unicode.GetString(bytes);
}

Thus you have infinite recursive call when you reading Treasure property value of your Safe class

Console.WriteLine(safe.Treasure);

Here you read property value, which tries to decrypt.. property value, which tries to decrypt.. property value etc

Just use encrypted param which you are passing to method:

private string decrypt(String encrypted)
{
    byte[] bytes = Convert.FromBase64String(encrypted);
    return System.Text.Encoding.Unicode.GetString(bytes);
}
answered on Stack Overflow Feb 12, 2016 by Sergey Berezovskiy • edited Feb 12, 2016 by Sergey Berezovskiy
0

You should pass in the encrypted method variable to the FromBase64String call:

byte[] bytes = Convert.FromBase64String(encrypted);

Now you are calling decrypt from the Treasure setter, and inside you use Treasure again.


How you could have analyzed it yourself?

To resolve a StackOverflowException, check the call stack. There must be repetition in the methods called. Take something in the middle from the call stack and see what is called over and over again. Check if the recursion is intended. If not, try to see where the repetition originates from (in this case the call to Treasure from your decrypt method).

answered on Stack Overflow Feb 12, 2016 by Patrick Hofman
0
byte[] bytes = Convert.FromBase64String(Treasure);

in the getter is wrong. You call decrypt in the getter and then you call the getter in decrypt.

answered on Stack Overflow Feb 12, 2016 by marco
0

Change this line, this is causing recursion in accessing Treasure

 byte[] bytes = Convert.FromBase64String(Treasure);

it should be

byte[] bytes = Convert.FromBase64String(encrypted);
answered on Stack Overflow Feb 12, 2016 by Hari Prasad

User contributions licensed under CC BY-SA 3.0