我如何重构这个c++来删除标签/gotos ?
How can I refactor this C++ to remove the labels/gotos?
我的问题不是真正的问题,但我想使这段代码看起来比现在更优雅一点。它有意大利面条代码。
这是我得到的一个小例子。
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
}
一旦你完成了这个重写,你可以用一个简单的break
代替goto LABEL_22
。
EDIT:或者更明确地:
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
行,没有其他。
goto LABEL_1
永远不会执行,因为没有办法退出for
循环。
一旦这个被删除,你可以用break
代替goto LABEL_2
,或者更好的是用return 1;
(或者result = 1; return 1;
,如果return
不是一个局部变量)
如果您剪切并粘贴代码,那么我们可以将其剪切并粘贴到编辑器中,但基本上goto Label_19之前的行需要去断行所在的位置。break后面的if语句需要变成else if,而goto标签22可以变成break(或者将导致goto标签22的条件移到for循环中,就像我之前的回答一样)到for循环中。
PS:你的秘密对任何拥有可执行文件
相关文章:
- 将数组的地址分配给变量并删除
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- C/C++编译器通常会删除重复的库吗
- 从链接列表c++中删除一个项目
- C++如何通过用户输入删除列表元素
- 为什么在C++中使用私有复制构造函数与删除复制构造函数
- 是否需要删除包含对象的"pair"?
- 如何在自删除后将对象设置为nullptr
- 迭代时从向量和内存中删除对象
- 使用函数"remove"删除重复元素
- 如何从多映射中删除特定的重复项
- 运算符C++ "delete []"仅删除 2 个前值
- 删除指向指针的指针是运行时错误吗
- 将指针设置为"nullptr"并不能防止双重删除?
- 为什么示例代码访问IUnknown中已删除的内存
- 如何通过 getter 函数删除矢量的元素?
- 从控制台中删除最后打印的元素
- C++中的线程安全删除
- 如何从存储在std::映射中的std::集中删除元素
- 是否有C++编译器选项允许激进地删除所有函数调用,并将参数传递给具有空体的函数