2015-10-03 20 views
8

Trong một dự án lớn, tôi đã nhận được một số cảnh báo trình biên dịch từ g ++ - 5.1.1 chỉ khi xây dựng phiên bản phát hành (sử dụng cờ tối ưu) nhưng không phải trong khi xây dựng phiên bản gỡ lỗi (vô hiệu hóa tối ưu hóa trình biên dịch nhất). Tôi đã thu hẹp sự cố xuống ví dụ tối thiểu được liệt kê bên dưới với các lệnh để tái tạo sự cố. Vấn đề không xảy ra nếu tôi sử dụng g ++ - 4.8.4. Có phải là lỗi này trong g ++ - 5.1.1 không? Hay, đoạn mã này có làm điều gì sai trái và bảo đảm cảnh báo đó không? Tại sao nó không tạo ra bất kỳ cảnh báo nào cho ba trường hợp cuối cùng được liệt kê trong mã (xem phần chỉnh sửa ở dưới cùng để giải thích)?g ++ - 5.1.1 cảnh báo về biến không sử dụng chỉ khi cờ tối ưu hóa được sử dụng

Đối với những người quan tâm, đây là bug report trong Bugzilla của GCC.

/* 

This code complains that the variable 'container' is unused only if optimization 
flag is used with g++-5.1.1 while g++-4.8.4 does not produce any warnings in 
either case. Here are the commands to try it out: 

$ g++ --version 
g++ (GCC) 5.1.1 20150618 (Red Hat 5.1.1-4) 
Copyright (C) 2015 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 

$ g++ -c -std=c++11 -Wall -g -O0 test_warnings.cpp 

$ g++ -c -std=c++11 -Wall -O3 test_warnings.cpp 
test_warnings.cpp:34:27: warning: ‘container’ defined but not used [-Wunused-variable] 
const std::array<Item, 5> container {} ; 
          ^
*/ 
#include <array> 
struct Item 
{ 
    int itemValue_ {0} ; 
    Item() {} ; 
} ; 

// 
// The warning will go away if you do any one of the following: 
// 
// - Comment out the constructor for Item. 
// - Remove 'const' from the next line (i.e. make container non-const). 
// - Remove '{}' from the next line (i.e. remove initializer list). 
// 
const std::array<Item, 5> container {} ; 
// 
// These lines do not produce any warnings: 
// 
const std::array<Item, 5> container_1 ; 
std::array<Item, 5> container_2 ; 
std::array<Item, 5> container_3 {} ; 

Edit: Như đã đề cập bởi Ryan Haining trong các ý kiến, container_2container_3 sẽ có extern liên kết và trình biên dịch không có cách nào cảnh báo về việc sử dụng của họ.

+2

'container_2' và' container_3' sẽ có liên kết 'extern' tiềm ẩn, vì vậy không thể biết chúng có được sử dụng –

+0

@RyanHaining hay không, tốt về hai điểm đó. Tôi sẽ để chúng ở đó để hoàn thành tất cả bốn kết hợp (có/không có 'const' và' {} '). – crayzeewulf

Trả lời

1

này trông giống như một lỗi, nếu chúng ta nhìn vào những tài liệu cho -Wunused-variable nó nói (nhấn mạnh tôi):

Tùy chọn này ngụ ý -Wunused const biến cho C, nhưng không phải cho C++

và nếu chúng ta nhìn vào -Wunused-const-variable nó nói:

Cảnh báo bất cứ khi nào một biến tĩnh cố định không được sử dụng ngoài tuyên bố của nó. Cảnh báo này được kích hoạt bởi biến -Wunused cho C, nhưng không cho C++. Trong C++, đây không phải là lỗi vì các biến const thay thế #defines bằng C++.

và chúng tôi có thể thấy cảnh báo này biến mất trong the head revision of gcc.

Báo cáo lỗi gcc này: -Wunused-variable ignores unused const initialised variables cũng có liên quan. Mặc dù nó là chống lại C C + + trường hợp cũng được thảo luận.

+0

Cảm ơn tất cả thông tin hữu ích này. Có vẻ như các cảnh báo flip-flops là một trong những phiên bản khác nhau sử dụng gcc. Vì vậy, nó chắc chắn trông giống như một lỗi. – crayzeewulf

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