gpt4 book ai didi

c++ - 我如何重构此 C++ 以删除标签/goto?

转载 作者:搜寻专家 更新时间:2023-10-31 01:19:47 24 4
gpt4 key购买 nike

我的问题不是真正的问题,但我想让这段代码看起来比现在更优雅。它有意大利面条代码。

这是我得到的一个小例子。

 int func(...) {
if ( ... )
{
v6 = ESI_1C;
EBP = 1;
v5 = 0;
v21 = 0;
v19 = 0;
v25 = ESI_1C;
if ( packetSize > 1 )
{
v26 = (unsigned __int8)initialCryptAnswer;
v10 = v8 - v6;
v11 = v6 + 4;
for ( i = v8 - v6; ; v10 = i )
{
v12 = *(DWORD *)(v10 + v11);
v21 += v12;
cryptAnswer = (unsigned __int8)cryptTable[(2 * (unsigned __int8)v26)+1];
v13 = EBP & 3;
if ( !(EBP & 3) )
break;
if ( v13 == 1 ) {
v16 = cryptAnswer >> 1;
*(DWORD *)v11 = v12 - v16;
} else if ( v13 == 2 ) {
*(DWORD *)v11 = v12 + 2 * cryptAnswer;
} else if ( v13 == 3 ) {
v16 = cryptAnswer >> 2;
*(DWORD *)v11 = v12 - v16;
}
LABEL_19:
v17 = *(DWORD *)v11 + v19;
++EBP;
v11 += 4;
v19 = v17;
++v26;
if ( EBP >= packetSize )
{
ESI = v24;
v5 = v17;
v6 = v25;
goto LABEL_22; //kinda like break it's much more because it's instead of a for loop too.
}
}
*(DWORD *)v11 = v12 + 4 * cryptAnswer;
goto LABEL_19; //this is a looper
}
LABEL_22:
result = 1;
} else {
result = 0;
}
return result;
}

我该怎么做才能去掉标签而不打乱代码流,因为它是加密函数中非常重要的一部分?

最佳答案

第二个答案,因为问题变化很大。

原始代码在删除所有冗余内容后如下所示:

for (... ; ; ...)
{
...
if (...)
{
break;
}
ABC
LABEL_19:
DEF
}
XYZ;
goto LABEL_19;

这与以下内容完全相同:

for (... ; ; ...)
{
...
if (...)
{
XYZ;
}
else
{
ABC
}

DEF
}

完成此重写后,您可以将 goto LABEL_22 替换为简单的 break

编辑:或者更明确地说:

for (... ; ; ...)
{
...
if (! (ESP & 3) )
{
// This line used to be located after the loop.
*(DWORD *)v11 = v12 + 4*cryptAnswer; // 111
}
else
{
if (v13 == 1)
{
...
}
else if (v13 == 2)
{
...
}
else if (v13 == 3)
{
...
}
}

// This is where LABEL_19 used to be.

v17 = ... // 222
}

当您像这样重写代码时,经验法则是代码应该按照与以前相同的顺序执行相同的操作。您不能盲目地移动代码,为此您必须了解代码的流程。在这种情况下,当第一个 if 被执行时,我用 //111 标记的行首先被执行,然后是行 //222,没有别的。

关于c++ - 我如何重构此 C++ 以删除标签/goto?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5700006/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com