在调试崩溃时,我在一些代码中遇到了这个问题:
int func()
{
char *p1 = malloc(...);
if (p1 == NULL)
goto err_exit;
char *p2 = malloc(...);
if (p2 == NULL)
goto err_exit;
...
err_exit:
free(p2);
free(p1);
return -1;
}
当第一个 malloc 失败时就会出现问题。因为我们跳过了初始化p2
,它包含随机数据和调用free(p2)
可能会崩溃。
我期望/希望这会被以与 C++ 中相同的方式处理,其中编译器不允许 goto 跳过初始化。
我的问题:是跳过标准允许的初始化还是这是 gcc 的 c99 实现中的错误?
当您跳过变量定义时,您可以使用以下命令让 gcc 发出警告-Wjump-misses-init
然后你可以使用-Werror
(或者,更准确地说,-Werror=jump-misses-init
)强制用户处理它。此警告包含在-Wc++-compat https://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html因此 gcc 开发人员知道代码在 C 和 C++ 中的行为有所不同。
您还可以稍微更改一下代码:
int func()
{
char *p1 = malloc(...);
if (p1 == NULL)
goto err_exit_1;
char *p2 = malloc(...);
if (p2 == NULL)
goto err_exit_2;
...
err_exit_2:
free(p2);
err_exit_1:
free(p1);
return -1;
}
...并保持将标签与初始化变量配对。使用统一变量调用许多其他函数时,您也会遇到同样的问题,而 free 恰好是一个更明显的问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)