Tôi tóm tắt vấn đề của mình cho chương trình ngắn sau đây.SEGFAULT ở chế độ -O3?
Nó chỉ gây SEGFAULT ở chế độ -O3 (-O2 hoạt động tốt). Theo số gdb
, điều này xảy ra tại số *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;
}
Vui lòng cho tôi biết, tôi đang làm gì sai?
Đó là một vi phạm trắng trợn của [sự cai trị răng cưa chặt chẽ] (http : //stackoverflow.com/questions/98650/what-is-the-strict-aliasing-rule). Đối với vụ tai nạn có thể là do bạn truy cập dữ liệu chưa được ký. Do vấn đề bí danh, điều này có thể không hữu ích, nhưng hãy cố gắng biên dịch với nhiều cảnh báo hơn (ví dụ: '-Wall -Wextra -pedantic') và xem liệu nó có nói cho bạn điều gì không. –
@JoachimPileborg Tôi biên soạn mã này trên MSVC với -W4 -Wx, và nó được biên dịch tốt. –
AFAIK MSVC++ không bao giờ giả định các quy tắc bí danh nghiêm ngặt và không thực hiện bất kỳ sự tối ưu nào phụ thuộc vào các quy tắc này. –