2011-12-18 39 views
6

Tôi đang cố gắng để biên dịch sau đây trên gcc với -pedantic-errors -pedantic -Wall -O2cảnh báo aliasling nghiêm ngặt về gcc 4.6.1 lỗi

#include <iostream> 

void reset_uint32(uint32_t* pi) 
{ 
    char* c = (char*)(pi); 
    uint16_t* j = (uint16_t*)(c); // warning? 
    j[0] = 0; 
    j[1] = 0; 
} 

void foo() 
{ 
    uint32_t i = 1234; 
    reset_uint32(&i); 
} 

int main() { 
    foo(); 
} 

Nhưng tôi không thấy bất kỳ cảnh báo răng cưa chặt chẽ. Tôi cũng đã cố gắng bật

-fstrict-aliasing 
-Wstrict-aliasing 

nhưng vẫn không có cảnh báo. Có phải đây là lỗi không?

+1

Điều bạn đang cố gắng làm không có ý nghĩa gì. Tại sao không chỉ làm '* pi = 0'? – Pubby

+4

@Pubby: Có lẽ đây chỉ là một trường hợp thử nghiệm tối thiểu giả tạo ... –

+0

Đầu tiên, quy tắc bí danh cho phép chuyển đổi đến và từ 'char *'. Thứ hai, g ++ không hứa sẽ cảnh báo, chỉ nói rằng nó sẽ thử. Nếu bạn thay đổi nó để chuyển đổi trực tiếp thành 'uint16_t' và có' -Wstrict-aliasing = 1' nó sẽ cho bạn một cảnh báo. – Omnifarious

Trả lời

1

Tôi viết lại ví dụ của bạn để tạo ra một cảnh báo về vi phạm các quy tắc nghiêm ngặt-aliasing:

void foo(int* pi) { 
    short* j = (short*)pi; 
    j[0] = j[1] = 0; 
} 

int main() { 
    int i = 1234; 

    foo(&i); 

    short* j = (short*)&i; 
    j[0] = j[1] = 0; 
} 

Mặc dù, g ++ 4.6 chỉ hiển thị các cảnh báo nếu bạn biên dịch mã với -Wstrict-aliasing=2 thay vì -Wstrict-aliasing. Ngoài ra, nó chỉ hiển thị cảnh báo cho các diễn viên trong main(), không phải trong foo(). Nhưng tôi không thể thấy làm thế nào/tại sao trình biên dịch sẽ nhìn vào hai phôi khác nhau.

+0

Whats sự khác biệt với '-Cắt-aliasing = 2' và' -Wstrict-aliasing'? – user1086635

+0

@ user1086635: Giả sử ba cấp độ phát hiện bí danh nghiêm ngặt có tỷ lệ dương tính giả ngày càng thấp thông qua phân tích chi tiết hơn về mã. 1 là mức 'tồi tệ nhất' với tỷ lệ dương tính giả cao nhất, và 3 là mức 'tốt nhất' với tỷ lệ dương sai thấp nhất. Trong khi chơi với các cấp độ bản thân mình, có vẻ như 3 cũng có tỷ lệ âm cao giả. – Omnifarious

+0

"_Nhưng tôi không thể xem làm thế nào/tại sao trình biên dịch sẽ nhìn vào hai phôi khác nhau._" Bởi vì trong 'main' trình biên dịch biết loại khai báo của biến. – curiousguy

Các vấn đề liên quan