g++ 与 MS c++ 中的未初始化指针

问题描述

最近,我阅读了一个编码示例,其中解释了以下内容会导致 Visual Studio 中的编译器错误

import React,{ Component } from "react";
import { View,Text,SectionList } from "react-native";
import { Picker } from "@react-native-picker/picker";

export default class App extends Component {
  find_dimension(layout){
    const {x,y,width,height} = layout;
    console.warn(x);
    console.warn(y);
    console.warn(width);
    console.warn(height);
  }

  render(){
    return(
      <View>
        <Picker onLayout={(event) => {this.find_dimension(event.nativeEvent.layout)}}>
          <Picker.Item label="Java" value="java" />
          <Picker.Item label="JavaScript" value="js" />
        </Picker>
      </View>
    )
  }
}

作者声称,由于 int* pointer1; *pointer1 = 10; 在被取消引用之前未初始化,因此 Visual Studio 中出现以下错误

C4700:使用了未初始化的局部变量“pointer1”

而且确实如此。这个场景是有道理的。

但是,如果我使用完全相同的代码并使用 g++ 进行编译,则不会发生编译器错误并且我可以以任何正常方式自由使用 pointer1

为什么不同? g++ 是否在初始化之前为 pointer1 分配了地址?

解决方法

尝试将 -Wuninitialized -Werror 传递给 gcc。此外,-Wmaybe-uninitialized 可能有助于识别未初始化变量的执行路径。

附带说明:取消引用未初始化的指针是未定义的行为。这意味着编译器可以但不必诊断它。完全归咎于开发者。