簡體   English   中英

G++ 標志以防止使用未初始化的繼承屬性

[英]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構造函數中類型與typetyp

那么我怎樣才能讓 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM