Ich habe mein Problem zu dem folgenden kurzen Programm zusammengefasst.SEGFAULT im -O3-Modus?
Es verursacht SEGFAULT nur im Modus -O3 (-O2 funktioniert einwandfrei). Nach gdb
passiert es bei *f = 0
Zeile.
#include <iostream>
void func1(int s, int t)
{
char* buffer = new char[s + t*sizeof(float)];
if (!buffer)
{
std::cout << "new failed\n";
return;
}
float* f = (float*)(buffer + s);
for (int i = 0; i < t; ++i)
{
*f = 0;
//std::cout << i << std::endl; // if uncomment this line everything will work fine
++f;
}
delete [] buffer;
std::cout << "done\n";
}
int main()
{
int s = 31, t = 12423138;
std::cout << s << " " << t << std::endl;
func1(s, t);
return 0;
}
Bitte lassen Sie mich wissen, was mache ich falsch?
Das ist eine grobe Verletzung der [strengen Aliasing-Regel] ist (http : //stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule). Was den Absturz betrifft, liegt es wahrscheinlich daran, dass Sie auf nicht ausgerichtete Daten zugreifen. Aufgrund des Alias-Problems kann es nicht helfen, aber versuchen Sie, mit mehr Warnungen zu kompilieren (z. B. "-Wand -Wextra -pedantisch") und sehen Sie, ob es Ihnen etwas sagt. –
@JoachimPileborg Ich kompilierte diesen Code auf MSVC mit -W4 -Wx, und es kompiliert gut. –
AFAIK MSVC++ nimmt niemals strenge Aliasing-Regeln an und macht keine Optimierungen von diesen Regeln abhängig. –