[英]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
。
編輯:或更明確地說:
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之前的行需要轉到中斷線所在的位置。 中斷之后的if語句需要變為else if,並且goto標簽22可以變為中斷(或像我之前的回答一樣,將導致goto標簽22的條件移動到for循環中)到for循環中。
PS:您的秘密對擁有可執行文件的任何人都不是秘密
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.