ich diesen einfachen Code haben, der die Datei für „Daten“ Schritt für Schritt in einer Datei pcm wav mit fseek sucht:C++ O3 Optimierung Pausen arbeiten, während Schleife
FILE * waveFile;
waveFile = fopen (this->fileLocation.c_str (), "rb");
// ... some other code here between, then ... //
int seekTo = 0;
bool found = false;
char data[4];
rewind (waveFile);
while (!found && (fseek (waveFile, seekTo, SEEK_SET) == 0)) {
fread (data, sizeof (data), 1, waveFile);
if ((std::strcmp (data, "data") == 0) || (std::strcmp (data, "Data") == 0) || (std::strcmp (data, "DATA") == 0)) {
found = true;
fread (&waveHeader->DATA_SIZE, sizeof (waveHeader->DATA_SIZE), 1, waveFile);
}
seekTo++;
}
Der Code funktioniert einwandfrei, und auf Testdateien es findet die Daten, liest die restlichen. Da die "Daten" selbst bei den größten Dateien fast am Anfang stehen, ist dieser Code für mich in Ordnung.
Aber, wenn ich die cpp-Flag -O3 hinzufügen, geht Code drunter und drüber, während Schleife endet nie.
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -O3")
Ich Cmake + LLDB (osx, Clion) verwendet wird, geschieht gleiche Sache, wenn ich GDB verwenden.
Was kann das Problem sein, wie kann ich das beheben?
PS. Ich versuche nicht, den Code zu verbessern, den Sie sehen, ich versuche zu verstehen, warum Compiler-Optimierung diese While-Schleife hackt.
PSS. Hier ist die Null-terminierten Code arbeiten:
int seekTo = 0;
char data[5];
rewind (waveFile);
while ((fseek (waveFile, seekTo, SEEK_SET) == 0)) {
fread (data, 4, 1, waveFile);
data[ 4 ] = '\0';
if ((std::strcmp (data, "data") == 0) || (std::strcmp (data, "Data") == 0) || (std::strcmp (data, "DATA") == 0)) {
fread (&waveHeader->DATA_SIZE, sizeof (waveHeader->DATA_SIZE), 1, waveFile);
break;
}
seekTo += 1;
}
'std :: strcmp (Daten," Daten ") == 0" liest außerhalb der Grenzen von 'Daten'. Du vergisst die Null-Beendigung. Vielleicht möchten Sie 'Memcmp' mit der Länge' 4'. –
Sie sollten auch überprüfen, ob "fread" erfolgreich war und brechen Sie die Schleife, wenn es fehlgeschlagen –
@ M.M Ich habe ursprünglich die Größe_t für fread im Code überprüfen und es gibt 0 an irgendeinem Punkt zurück. Aber in jeder Datei habe ich "Daten" drin, und das Dateiende ist erreicht, bevor etwas gefunden wird. Also habe ich die Endeprüfung für das Debugging entfernt. – emrahgunduz