PDA

View Full Version : Conversion of QString to char array yields garbage when in debug mode



antimatter
1st April 2016, 02:00
Hi,

during debug mode (F5 with default keys) the conversion from QString to char* fails and produces garbage data. That way, I cannot debug my program properly. When running my program normally (Ctrl+R) it's working just fine.

Below you will find a small example, that determines the type of drives in Windows. I tested with Qt 5.5.1 and Qt 5.4.2. Qt Creator is at version 3.6.1.



#include <iostream>
#include <windows.h>
#include <winbase.h>
#include <QtCore>
using namespace std;

int main(void)
{
QFileInfoList localDrives = QDir::drives();
for (QFileInfo info : localDrives)
{
const char *drive = QDir::toNativeSeparators(info.path()).toStdString( ).c_str();
UINT drivetype = GetDriveTypeA(drive);
qDebug() << info.path().left(1) << QString::fromLocal8Bit(drive) << "is" << drivetype;
}
return 0;
}


Here is the output during debug mode. Of course, GetDriveTypeA(...) returns always 1 here. Sh*t in, sh*t out.


Debugging starts
"C" "««««««««îþîþ\u 0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000ma?\ u0003OÇ\u0000\u0018\u0001ð\u00ADº\u0000\ u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0 000\u0000\u0000««««««««\u0 000\u0000\u0000\u0000\u0000\u0000\u0000\u0000la?\u 0002OÇ\u0000\u001CÈ\u00ADÆk««« «««««îþîþ\u0000\u0000\u 0000\u0000\u0000\u0000\u0000\u0000la?\u0002NÇ\ u0000\u0018ȬÆk\u0001\u0000\u0000\u0000à ‚«Â«Â«Â«Â«Â«Â«Â«\u0000\u0000\u0000\ u0000\u0000\u0000\u0000\u0000ka<\u0006NÇ\u0000\u0000\u0010G€\u0000P\u0019à ‚€\u0000îþîþîþîþla?\u000 2IÇ\u0000\u0018ȬÆk\u0000\u0000\u000 0\u0000««««««««\u0000\u000 0\u0000\u0000\u0000\u0000\u0000\u0000ma?\u0003NÃ⠀¡\u0000\u001C(¼Æk\u0002\u0000\u0000\u0000\ u0000\u0000\u0000\u0000«««««« «Ã‚«Ã®Ã¾Ã®Ã¾\u0000\u0000\u0000\u0000\u000 0\u0000\u0000\u0000na?\u0000OÇ\u0000$(¼Æ k\u0003\u0000\u0000\u0000\u0000\u0000\u0000\u0000 ««««««««îþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾\u0000\u0000\u0000\u 0000\u0000\u0000\u0000\u0000la?\u0002LÇ\u0000\ u0018ȬÆk\u0002\u0000\u0000\u0000« «Ã‚«Â«Â«Â«Â«Â«\u0000\u0000\u0000\u0000\ u0000\u0000\u0000\u0000la?\u0002NÇ\u0000\u0018 ȬÆk\u0003\u0000\u0000\u00ò¥êBi o
"D" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"E" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"F" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"G" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"I" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"P" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"Q" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"R" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
"W" "îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ îþîþîþîþîþîþà ®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã® þîþîþîþîþîþîà ¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾Ã®Ã¾ oa?\u0001VÇ" is 1
Debugging has finished


And here's the output from normal run:


Starting D:\Andreas\Qt\build-StringTest-Desktop_Qt_5_5_1_MinGW_32bit2-Debug\debug\StringTest.exe...
"C" "C:\\" is 3
"D" "D:\\" is 3
"E" "E:\\" is 5
"F" "F:\\" is 2
"G" "G:\\" is 2
"I" "I:\\" is 3
"P" "P:\\" is 5
"Q" "Q:\\" is 5
"R" "R:\\" is 5
"W" "W:\\" is 3
D:\Andreas\Qt\build-StringTest-Desktop_Qt_5_5_1_MinGW_32bit2-Debug\debug\StringTest.exe exited with code 0


What could be the problem and can I do something to solve it?

Merci.

anda_skoa
1st April 2016, 08:56
That this works in normal run mode is just conincidence, it is always wrong.

"drive" becomes an invalid pointer after that line of code has executed, i.e. the std::string returned by toStdString() is a temporary object and goes out of scope right after you have accessed c_str().
Since c_str() returns a pointer to the std::string's internal data, which is deleted when the std::string is destroyed, the pointer you have in "drive" is now invalid.

You could just keep the std::string and call c_str() when you need it to pass to GetDriveTypeA().

Better yet would be to use QFile::decodeName() instead of toStString() to get the local representation.

Cheers,
_

antimatter
5th April 2016, 11:57
Ah, that's why.
Thanks for that explanation. Now I see it, too.