我正在用C开发一个基本的应用程序,使用OP-TEE (TrustZone Secure )库.我正在QEMU中运行代码。下面是发生奇怪行为的代码:
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标签会被到达,即使之前没有发生错误吗?
发布于 2018-08-16 14:58:52
没有特殊的逻辑阻止代码通过标签。
按照惯例,goto在C中通常用于这种错误处理,但不必是那样的。goto的标签可以在函数中的任何地方自由放置。例如,您可以这样做:
void f()
{
int i;
start:
printf("i=%d\n", i);
i++;
if (i < 10) {
goto start;
}但请不要。
发布于 2018-08-16 14:52:08
如果您执行err:标签,或者在执行goto之后,就会到达goto标签。这意味着不管这个功能成功与否,你都会得到清理。这就是使用"on“模式的全部原因。
goto的一个更易读的替代方法是在错误时返回并将清理保留在外部包装函数中。
发布于 2018-08-16 15:18:33
如果通过正常的执行流程到达标记语句,则不会跳过它。IOW,给定的代码如下
if ( condition )
{
goto err;
}
err:
// error handling code
// regular code如果condition的计算结果为false,那么err后面的代码仍然会被执行,因为它遵循if语句。您可以使用第二个标签和goto来避免这种情况。
if ( condition )
{
goto err;
}
goto normal;
err:
// error handling code
normal:
// regular code但是想出一种没有目标的方法来解决这个问题更好。
https://stackoverflow.com/questions/51879778
复制相似问题