2016-08-11 2 views
1

Ich bin mir nicht sicher, ob ich Vala oder GLib.Regex missbrauche, weil ich für beide neu bin. Ich habe ein minimales Beispiel erstellt, das den Fehler reproduziert. Aus dem folgenden Code, würde ich erwarten, dass es a INPUTX b sechsmal druckt, mit dem Präfix source und result abwechselnd:Die Verarbeitung von Vala-Strings beschädigt den Speicher. Warum und wie vermeiden?

public class Test 
{ 
    public static void run(string src) 
    { 
     var regex = new Regex("INPUT[0-9]"); 
     for(int i = 0; i < 3; ++i) 
     { 
      stdout.printf(@"-- source: $src\n"); 
      src = regex.replace(src, -1, 0, "value"); 
      stdout.printf(@"-- result: $src\n\n"); 
     } 
    } 

    public static void main() 
    { 
     Test.run("a INPUTX b"); 
    } 
} 

ich diesen Code schrieb basierend auf the example in the docs. Nachdem jedoch mit valac Test.vala --pkg glib-2.0 Kompilieren und Ausführen, erhalte ich:

-- source: a INPUTX b 
-- result: a INPUTX b 

-- source: -- source: 
-- result: N� 

-- source: -- source: 
-- result: PN� 

Was mache ich falsch?

Antwort

1

Nachdem in den generierten C-Code suchte, schloss ich, dass dies eher ein Vala bezogenes Problem ist: Vala ein g_free bis zum Ende des Körpers setzt Schleife, die den Speicher durch g_regex_replace zurück befreit, und das von src verwiesen wird . Aber warum macht Vala das?

Der Grund dafür ist, dass (see)

Argumente sind, die standardmäßig unowned.

Daher wird, wenn wir die string Objekt zurückgegeben durch regex.replace zum unowned string src zuzuweisen, dass Referenz (see)

nicht in dem Objekt aufgezeichnet

und dem Vala kompilieren hält es um sicher zu sein zu entsorgen - obwohl es nicht leise ist, warum passiert das besonders am Ende des Körpers der Schleife.

Also die Straight-Forward-Lösung ist die src Argument als owned zu deklarieren.

+0

Sie sollten dies auf https://bugzilla.gnome.org/ melden. –

+0

@ JensMühlenhoff: Danke für deinen Kommentar. Aber ich denke, das ist kein Käfer, oder? – theV0ID

+0

Ich denke, es könnte sein, siehe die Antwort, die ich jetzt gepostet habe. –

0

Betrachten Sie diese (Unsinn) Code:

string foo (string s) 
{ 
    return s; 
} 

void run (string src) 
{ 
    var regex = new Regex("INPUT[0-9]"); 
    for(int i = 0; i < 3; ++i) 
    { 
     stdout.printf(@"-- source: $src\n"); 
     //src = regex.replace(src, -1, 0, "value"); 
     src = foo (src); 
     stdout.printf(@"-- result: $src\n\n"); 
    } 
} 

void main() 
{ 
    run("a INPUTX b"); 
} 

Der Vala Compiler (zu Recht) klagt:

test.vala:13.2-13.16: error: Invalid assignment from owned expression to unowned variable 
     src = foo (src); 
     ^^^^^^^^^^^^^^^ 

gibt also verschiedene für Methoden aus vapi Dateien etwas sein muss, da es sich um den Anruf erlaubt zu Regex.replace().

Ich rieche einen Fehler irgendwo (entweder im Compiler oder der Vapi), aber ich bin mir nicht sicher.

+1

Die VAPI ist in Ordnung; Das Problem ist, dass der Compiler keinen Fehler erzeugt, wenn es sollte. Scheint aufgrund der Tatsache zu sein, dass Regex.replace eine Ausnahme auslöst (ohne die Ausnahme wird der Fehler generiert). – nemequ

Verwandte Themen