[英]G++ flag to protect against use of uninitialized inherited properties
我怎樣才能使 g++ 保護我不使用未初始化的父屬性進入子構造函數?
struct A {
A(int typ): type{typ} {}
const int type;
};
struct B : public A {
B(int typ): A(type) {}
};
int main() {
B b{3};
return 0;
}
你能看到這里的錯誤嗎,它有多棘手? 在這里,我們以3
作為參數構建B
的實例,我們希望A
中的type
值為3
,對嗎? 但是我們在B
構造函數中輸入了錯誤,我們沒有將接收到的參數的內容傳遞給A
,而是A::type
中已經存在的值的內容。 查看B
構造函數中類型與type
的typ
。
那么我怎樣才能讓 g++ 溫暖我呢? 因為它不應該被允許, A
還沒有初始化,我們不應該能夠訪問A
屬性。
要使用的標志是-Wuninitialized
,它已經嵌入了-Wextra
和-Wall
。
但就我而言,我在 c++14 模式下使用 gcc-6.4。 使用此 gcc 版本,您必須使用標志、啟用優化並使用已使用未初始化變量初始化的變量。 只有當所有這些條件都已完成時,gcc 才會警告您使用未初始化的變量。
您可以在這里看到: https://compiler-explorer.com/z/q53sYr - 如果我刪除-O2
標志或 b.type 上的最后一個條件, b.type
不會警告我們。
正如手冊頁所說( https://man7.org/linux/man-pages/man1/g++.1.html ):
請注意,對於僅用於計算本身從未使用的值的變量可能沒有警告,因為在打印警告之前,數據流分析可能會刪除此類計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.