Tôi đang cố gắng để biên dịch sau đây trên gcc với -pedantic-errors -pedantic -Wall -O2
cả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?
Đ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
@Pubby: Có lẽ đây chỉ là một trường hợp thử nghiệm tối thiểu giả tạo ... –
Đầ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