wchar_t valgrind issue - Ungültiges Lesen der Größe 8

8

Ich kann nicht herausfinden, warum Valgrind Invalid read of size 8 druckt, wenn wchar_t verwendet wird. Ich benutze ein 64bit Ubuntu (3.5.0-25) System mit Valgrind-3.7.0 und Gcc 4.7.2.

%Vor%

Kompilieren:

%Vor%

Valgrind Ergebnisse:

%Vor%

Wenn ich jetzt dasselbe aber mit einer 'funktionierenden Zeichenkette' benutze, sagen wir

%Vor%

Ich bekomme kein Problem:

%Vor%

Zuerst dachte ich, dass die String-Größe immer ein Vielfaches von 8 sein sollte (vielleicht wcs lesen Blöcke von 8), aber einige Fälle scheiterten, dann dachte ich, ich müsste immer 8 Bytes für den NULL-Terminator hinzufügen ((wcslen(item) + 2) * sizeof(wchar_t)) Es hat funktioniert, aber das macht keinen Sinn, da sizeof(wchar_t) - in meinem System - 4 Bytes lang ist und genug sein sollte, um den L'wcslen' Terminator zu verarbeiten.

Ich lese auch den glibc %code% Quellcode, aber nichts neues. Ich denke jetzt an Valgrind Problem. Könnt ihr hier etwas Licht werfen? Lohnt es sich einen Fehler gegen Valgrind zu melden?

Danke

    
Jose 22.03.2013, 14:41
quelle

1 Antwort

6

Dies wird wahrscheinlich durch SSE-Optimierung der Funktion wcslen verursacht; siehe z.B. Ссылка oder Ссылка .

Bei der Optimierung von wcslen ist es schneller, mehrere große Zeichen gleichzeitig zu lesen und vektorisierte Anweisungen (SSE) zu verwenden, um sie mit L'wcslen' zu vergleichen. Leider sieht Valgrind dies als nicht initialisierten Lesevorgang - was es ist, aber es ist harmlos, weil das Ergebnis von %code% nicht vom nicht initialisierten Wert abhängt.

Der Fehler besteht darin, valgrind zu aktualisieren, in der Hoffnung, dass eine neuere Version die falsch positive unterdrückt.

    
ecatmur 22.03.2013, 15:07
quelle

Tags und Links