10

Hãy xem xét hai chức năng:Việc truyền mảng char sang loại khác có vi phạm quy tắc bí danh nghiêm ngặt không?

int f1() 
{ 
    alignas(int) char buf[sizeof(int)] = {}; 
    return *reinterpret_cast<int*>(buf); 
} 

int f2() 
{ 
    alignas(int) char buf[sizeof(int)] = {}; 
    char* ptr = buf; 
    return *reinterpret_cast<int*>(ptr); 
} 

GCC cảnh báo rằng người đầu tiên vi phạm quy tắc nghiêm ngặt-aliasing. Nhưng thứ hai là OK.

Clang chấp nhận cả hai mà không có khiếu nại.

Cảnh báo có hợp pháp không?

+0

Có. "Đối tượng" ở đây là một 'char' hoặc mảng' char 'và glvalue là kiểu' int'; không có gì trong https://timsong-cpp.github.io/cppwp/basic.lval#8 bao gồm trường hợp này. –

Trả lời

8

Cảnh báo là hợp pháp. f2 không OK (hành vi không xác định), nó không kích động cảnh báo.

tôi nghi ngờ lý do mà f2 không gây cảnh báo là:

int f3() 
{ 
    int i = 0; 
    char *ptr = reinterpret_cast<char*>(&i); 
    return *reinterpret_cast<int*>(ptr); 
} 

hoàn toàn pháp lý. Bạn có thể sử dụng char* (hoặc void*) làm "con trỏ chung" - miễn là bạn truyền lại đúng loại trước khi truy cập. GCC rõ ràng là cẩn thận để tránh cảnh báo về f3, với chi phí không cảnh báo về f2.

Clang không cảnh báo về số f1 hoặc f2 - nhưng không bắt buộc.

+0

Cần báo giá chuẩn. –

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