Ho riassunto il mio problema con il seguente breve programma.SEGFAULT in modalità -O3?
Fa SEGFAULT solo in modalità -O3 (-O2 funziona correttamente). In base a gdb
, si verifica alla riga *f = 0
.
#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;
}
Per favore fatemi sapere, cosa sto sbagliando?
Quella è una grave violazione del [rigorosa regola aliasing] (http : //stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule). Per quanto riguarda il crash è probabilmente perché si accede ai dati non allineati. A causa del problema di aliasing, potrebbe non essere d'aiuto, ma provare a compilare con più avvisi (ad esempio "Wall -Wextra -pedantic") e vedere se ti dice qualcosa. –
@JoachimPileborg Ho compilato questo codice su MSVC con -W4 -Wx e ha compilato correttamente. –
AFAIK MSVC++ non assume mai rigide regole di aliasing e non rende le ottimizzazioni dipendenti da queste regole. –