У нас были очень странные проблемы с нашим приложением, и мы, наконец, отследили его до проблемы QFile / fdopen:
void foo(QString filename)
{
QFile qf(filename);
qf.open(QIODevice::ReadOnly);
int fd = qf.handle();
FILE* f = fdopen(fd, "rb");
// do some stuff with f
fclose(f); // !!! undefined behaviour !!!
}
Проблема с этим кодом заключается в том, что fclose (f) вызывается до уничтожения объекта QFile, это неправильный порядок: QTBUG-20372
... так что либо уничтожьте объект QFile перед вызовом fclose (), либо продублируйте дескриптор файла, возвращаемый QFile :: handle ():
void foo(QString filename)
{
QFile qf(filename);
qf.open(QIODevice::ReadOnly);
int fd = qf.handle();
FILE* f = fdopen(dup(fd), "rb"); // !!! use dup()
// do some stuff with f
fclose(f); // correct
}
PS: эти странные проблемы с нашим приложением обнаружились только в очень немногих системах с 10-секундной задержкой между оператором возврата в конце функции и фактическим возвратом из этой функции.Это было действительно странно.Итак, это пример «неопределенного поведения», проявляющегося в реальном мире: о)