【问题标题】:Error: jump to label 'failed' [-fpermissive], GCC vs VS错误:跳转到标签“失败”[-fpermissive],GCC vs VS
【发布时间】:2023-03-20 14:39:01
【问题描述】:

我们在我们的游戏引擎的 PNG 解码例程中添加了一些新代码。定义的附加块只是为了读取一些值——没什么大不了的。

在 Visual C++ 上,它编译得很好。在我们主要使用的 GCC 上,我们现在遇到了一个以前从未发生过的奇怪问题:

compile_problems

这是添加的代码:

    /* read grAb chunk */
png_unknown_chunk *unknowns;
int num_unknowns = png_get_unknown_chunks(png_ptr, info_ptr, &unknowns);

for (int i = 0; i < num_unknowns; i++)
{
    if (!memcmp(unknowns[i].name, "grAb", 4))
    {
        png_grAb_t *grAb = reinterpret_cast<png_grAb_t *>(unknowns[i].data);
        grAb->x = EPI_BE_S32(grAb->x) + 160 - width / 2;
        grAb->y = EPI_BE_S32(grAb->y) + 200 - 32 - height;
        img->grAb = grAb;
        break;
    }
}

在我看来还不错。这是添加到我们原始文件中的唯一内容。完整的文件在这里: goto Line 59 of image_data.cc

还有这个爆炸的功能: image_data_c *PNG_Load(file_c *f, int read_flags)

我不明白会发生什么,因为这之前工作得非常好,并且在交叉初始化或我们的案例处理方面从来没有问题。

如果我能得到一些帮助,我将不胜感激!


【问题讨论】:

  • 请在问题本身中发布minimal reproducible example
  • 我想的差不多,但奇怪的是 VS 并没有因此而崩溃,而 GCC 则...:S
  • 嗯,[0,2] 编译器中的某些东西是正确的。没有 MCVE 就无法判断。

标签: c++ gcc png


【解决方案1】:

错误似乎很明显:标签failed:int num_unknowns 的初始化之前到之后的跳转,因此 int 将具有垃圾值。这在 C++ 中是被禁止的(但在 C 中是禁止的)。

一个解决办法是放

int num_unknowns = 0;

在函数的开头,将您发布的代码示例的第三行更改为对num_unknowns 的赋值。

另一个解决方案是指示 GCC 允许这样做,使用 -fpermissive 选项,如错误本身所示。

【讨论】:

  • 虽然您的解决方案确实使警告静音,但您未能证明生成的代码是正确的并且在所有相关平台上产生了所需的行为..
  • @Baum:显然他们已经跳过了很多任务,但是他们的所有初始化都在函数的顶部以允许跳转。然后他们添加了一个新变量,但忘记在函数顶部声明它。所以,这样做。这显然与更改之前一样正确,并且鉴于其名称,我认为 failed 块不会假设函数中的所有分配都成功,所以这甚至不是真正的误用goto.
猜你喜欢
  • 2022-01-17
  • 1970-01-01
  • 2015-12-23
  • 2019-04-11
  • 2017-08-17
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多