Bug in QDir::currentPath() auf Windows Plattform?

Alles rund um die Programmierung mit Qt
Antworten
René
Beiträge: 75
Registriert: 15. August 2006 11:14
Kontaktdaten:

Bug in QDir::currentPath() auf Windows Plattform?

Beitrag von René »

Ich habe mir angeschaut, wie die Qt-Entwickler QDir::currentPath() implementiert haben für die Windows-Plattform. Dabei ist mir in QFileSystemEngine_win.cpp in der Funktion QFileSystemEngine::currentPath() dieser Code hier aufgefallen.

Code: Alles auswählen

1113 QFileSystemEntry QFileSystemEngine::currentPath()
1114 {
1115     QString ret;
1116 #if !defined(Q_OS_WINCE)
1117     DWORD size = 0;
1118     wchar_t currentName[PATH_MAX];
1119     size = ::GetCurrentDirectory(PATH_MAX, currentName);
1120     if (size != 0) {
1121         if (size > PATH_MAX) {
1122             wchar_t *newCurrentName = new wchar_t[size];
1123             if (::GetCurrentDirectory(PATH_MAX, newCurrentName) != 0)
1124                 ret = QString::fromWCharArray(newCurrentName, size);
1125             delete [] newCurrentName;
1126         } else {
1127             ret = QString::fromWCharArray(currentName, size);
1128         }
1129     }
1130     if (ret.length() >= 2 && ret[1] == QLatin1Char(':'))
1131         ret[0] = ret.at(0).toUpper(); // Force uppercase drive letters.
1132 #else
1133     //TODO - a race condition exists when using currentPath / setCurrentPath from multiple threads
1134     if (qfsPrivateCurrentDir.isEmpty())
1135         qfsPrivateCurrentDir = QCoreApplication::applicationDirPath();
1136
1137     ret = qfsPrivateCurrentDir;
1138 #endif
1139     return QFileSystemEntry(ret, QFileSystemEntry::FromNativePath());
1140 }
Müsste nicht in Zeile 1123 statt 'PATH_MAX' vielmehr 'size' stehen? Ich habe mir bei MSDN die Dokumentation zu GetCurrentDirectory angesehen und ein wenig damit experimentiert. Wenn der erste Parameter, der die Größe angibt, zu klein ist, dann wird der zweite Parameter (der Buffer) ignoriert. Im obigen Code macht also der zweite GetCurrentDirectory Aufruf mit der gleichen Buffer-Size statt der neuen, größeren Size keinen Sinn.

Bevor ich einen Bugreport im Qt-Bugtracker aufmache, wie seht ihr das?
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: Bug in QDir::currentPath() auf Windows Plattform?

Beitrag von RHBaum »

Ohje ...

Ja du hasst recht, da muesste size stehen ....
wobei das absolut abartig ist, was die da machen ...
Glaub das hat nen Lehrling programmiert ^^

sie verstossen gleich gegen paar Regeln ....

DWORD size = 0;
size = ::GetCurrentDirectory(PATH_MAX, currentName);
warum size nicht gleich richtig initialisieren ?

wenn man "hart" mit Unicode arbeitet (wchar_t) , sollte man die Unicode version der API funktionen nehmen und nicht die switchende:
GetCurrentDirectoryW statt GetCurrentDirectory !

statt new wchar_t[size]; könnte man auch nen QVector< wchar_t> buffer(size,0); nehmen ....
Aber wahrscheinlich arbeiten sie mit ihren eigenen klassen ned so gern ^^

Ciao ....
Antworten