首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中使用goto进行错误处理的奇怪行为

在C中使用goto进行错误处理的奇怪行为
EN

Stack Overflow用户
提问于 2018-08-16 14:44:41
回答 4查看 226关注 0票数 1

我正在用C开发一个基本的应用程序,使用OP-TEE (TrustZone Secure )库.我正在QEMU中运行代码。下面是发生奇怪行为的代码:

代码语言:javascript
复制
void prepare_rsa_operation(TEE_OperationHandle *handle, uint32_t alg, TEE_OperationMode mode, TEE_ObjectHandle key) {
    TEE_Result ret = TEE_SUCCESS;   
    TEE_ObjectInfo key_info;

    ret = TEE_GetObjectInfo1(key, &key_info);
    if (ret != TEE_SUCCESS) {
        EMSG("TEE_GetObjectInfo1: %#" PRIx32, ret);
        goto err;
    }

    ret = TEE_AllocateOperation(handle, alg, mode, key_info.keySize);
    if (ret != TEE_SUCCESS) {
        EMSG("Failed to alloc operation handle : 0x%x", ret);
        goto err;
    }
    DMSG("========== Operation allocated successfully. ==========");

    ret = TEE_SetOperationKey(*handle, key);
    if (ret != TEE_SUCCESS) {
        EMSG("Failed to set key : 0x%x", ret);
        goto err;
    }
    DMSG("========== Operation key already set. ==========");

err:
    TEE_FreeOperation(handle);
    return 1;
}

发生的问题:

正在打印两条成功的消息(用于操作分配和键设置),但err标签已经到达,尽管如此:TEE_FreeOperation(handle);应该是TEE_FreeOperation(*handle);。我修复了这个问题,并删除了return,因为我的函数返回void。现在,代码运行良好,但据我理解,只有条件测试( err‘s)失败时才能到达goto标签,因为goto命令就在其中。

我的理解错了吗?有人能解释为什么err标签会被到达,即使之前没有发生错误吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2018-08-16 14:58:52

没有特殊的逻辑阻止代码通过标签。

按照惯例,goto在C中通常用于这种错误处理,但不必是那样的。goto的标签可以在函数中的任何地方自由放置。例如,您可以这样做:

代码语言:javascript
复制
void f()
{
    int i;
start:
    printf("i=%d\n", i);
    i++;
    if (i < 10) {
        goto start;
}

但请不要。

票数 2
EN

Stack Overflow用户

发布于 2018-08-16 14:52:08

如果您执行err:标签,或者在执行goto之后,就会到达goto标签。这意味着不管这个功能成功与否,你都会得到清理。这就是使用"on“模式的全部原因。

goto的一个更易读的替代方法是在错误时返回并将清理保留在外部包装函数中。

票数 3
EN

Stack Overflow用户

发布于 2018-08-16 15:18:33

如果通过正常的执行流程到达标记语句,则不会跳过它。IOW,给定的代码如下

代码语言:javascript
复制
if ( condition )
{
  goto err;
}

err:
  // error handling code

// regular code

如果condition的计算结果为false,那么err后面的代码仍然会被执行,因为它遵循if语句。您可以使用第二个标签和goto来避免这种情况。

代码语言:javascript
复制
if ( condition )
{
  goto err;
}
goto normal;

err:
  // error handling code

normal:
  // regular code

但是想出一种没有目标的方法来解决这个问题更好。

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

https://stackoverflow.com/questions/51879778

复制
相关文章

相似问题

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