首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在C++中过度删除“跨越变量初始化”错误?

在C++中过度删除“跨越变量初始化”错误?
EN

Stack Overflow用户
提问于 2013-08-07 10:05:36
回答 2查看 5.8K关注 0票数 8

我注意到g++crossed initialization的抱怨太严格了,我不知道为什么这些错误不能通过编译时查看程序的SSA形式就可以删除。

让我举一个很简单的例子:

代码语言:javascript
运行
复制
#include <cstdlib>

int main ()
{
  goto end;

  int i = 0; // unused variable declaration

 end:
  return EXIT_SUCCESS;
}

在使用g++ -Wall -Wextra -o example1 example1.cc (g++ 4.8.1)编译时,编译器提供以下错误消息:

代码语言:javascript
运行
复制
example1.cc: In function ‘int main()’:
example1.cc:10:2: error: jump to label ‘end’ [-fpermissive]
  end:
  ^
example1.cc:6:8: error:   from here [-fpermissive]
   goto end;
        ^
example1.cc:8:7: error:   crosses initialization of ‘int i’
   int i = 0;
       ^
example1.cc:8:7: warning: unused variable ‘i’ [-Wunused-variable]

因此,在实际上没有风险的情况下,它会引发一个错误,因为变量是未使用的(编译器显然有这两种信息,并且不能结合起来推断错误是假正的)。

更奇怪的是,我希望LLVM能够更有效地分析程序。因此,我在这个简单的例子中尝试了clang++ (LLVM)和clang++ -Wall -Wextra -o example1 example1.cc (clang++ 3.4)。而且,我也收到了同样的错误信息:

代码语言:javascript
运行
复制
example1.cc:8:7: warning: unused variable 'i' [-Wunused-variable]
  int i = 0;
      ^
example1.cc:6:3: error: goto into protected scope
  goto end;
  ^
example1.cc:8:7: note: jump bypasses variable initialization
  int i = 0;
      ^
1 warning and 1 error generated.

所以,我很确定我在这里遗漏了一些重要的东西,这个问题使得检测这个假阳性比我想象的更困难。但是,我不知道这是什么。或者,C++规范明确指出它必须是这样的。

如果有人有想法,可以随意分享!

编辑:我还在C (gccclang)中编译了完全相同的代码,它只对关于i是一个未使用的变量的警告很好。因此,它加强了这样一个事实,即这更有可能与C++规范相关联,而不是在编译时检测此问题的问题。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-08-07 10:25:07

编译器没有什么问题。您的代码按照标准格式不正确。

在您的特定情况下,标准的要求可能是不必要的,可以允许跳转,编译器可以创建有效的代码。然而,这只是因为变量int i的初始化没有副作用。

您可以通过简单地将跳转部分封装在它自己的作用域中,从而使代码有效:

代码语言:javascript
运行
复制
#include <cstdlib>

int main ()
{
  goto end;
  {
    int i = 0; // unused variable declaration
  }
end:
  // cannot use i here, as it's not defined.
  return EXIT_SUCCESS;
}
票数 10
EN

Stack Overflow用户

发布于 2013-08-07 10:21:44

这是不允许的,因为您可能会为未正确构造的对象调用析构函数。诚然,int没有构造函数或析构函数,但它使其对所有类型的对象都“公平”。从技术上讲,label end:上的一些东西可以使用i,通过严格的规则,它可以防止机器必须检查每一个代码路径(这就变成了一个“停止问题”)。

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18100504

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档