2011-10-20 24 views
0

這是我解碼的簽名代碼:這個代碼的逆向過程?

#include<stdio.h> 
int i; 
double q[]={6627601.1454013166}; 
int main() 
{ 
    if(1000.0-i++) 
    { 
     main(); 
    } 
    else 
    { 
     puts(q); 
    } 
} 

因爲我用C能否請你解釋一下什麼是在代碼完全發生[除了遞歸]初學者?

現在,我想知道如果我想創建一個類似的程序來打印我的名字,那麼生成數字的過程是什麼? 我試過如下: CODE1:

#include<stdio.h> 
int main() 
{ 
    double a; 
    scanf("%s",&a); 
    printf("%lf\n",a); 
} 

CODE2:

#include<stdio.h> 
int i; 
double q[]={31711421078673377979858439824814601270188287470225555299667257024608266243979287542515985597401536215834733576192.000000}; 

int main() 
{ 
    if(1000.0-i++) 
    { 
     main(); 
    } 
    else 
    { 
     puts(q); 
    } 
} 
  1. 爲什麼第二個代碼給僅輸出第8個字符? [如果我給輸入多達7個字符,它給輸出0.000000和多於8,它給出與8相同的輸出]

  2. 對於某些輸入,它只生成13位數字,對於某些輸入119位數字! #@#@ ???。

  3. 如何將這個龐大的數字減少到15-20位?

  4. 我怎樣才能得到你的特殊號碼的最後4位數[因爲我已經得到了前13位]?

+0

你的代碼使用浮點類型,就好像它們是字符串一樣 - 壞事情將會發生。你不能直接調用'3.14'來得到「3.14」。在你將一個字符串掃描成雙精度的情況下,你需要核心轉儲。 – mah

+3

你不想去那裏......然而。嚴重的是,這會產生許多關於變量存儲,內存佈局和浮點表示的細節。作爲初學者,你最好學習好的編碼實踐,而不是搞清楚如何濫用語言。 – AShelly

+0

值得一提的是,當您以十六進制格式查看IEEE幻數表示形式時,會得到0x41594844494E4153。當你從LSB開始,並將每個字節看作ascii時,你會得到SANIDHYA。 8個字符的限制是由於double是8個字節。我認爲主要的遞歸是錯誤的。遞歸在堆棧溢出之前結束並且名稱後面沒有多餘字符的事實是編譯器的具體實現細節,並可能在任意系統上失敗。 – AShelly

回答

1

好的。他正在採取一個字面float添加一個未初始化的int,然後檢查結果對整數0.至少有三件事是錯誤的。然後他告訴puts()指向double的指針實際上是他想要打印的字符串。噢,他正在重新裝甲main()!?

這種可怕的混亂可能發生在最終做他想做的事情上,但在某種程度上沒有人能夠輕易理解(並因此保持)。除了提交到International Obfuscated C Coding Contest以外,這完全是不可接受的工藝。

所以你想知道這裏發生了什麼?發生的事情是,某個村莊失蹤了。如果你找到寫這篇文章的人,那麼請把他的編譯器拿走,如果有必要的話,可以用武力。

我建議他爲他的職業生涯作爲牛仔競技小丑。他也許不能勝任,但在這種情況下,至少公牛隊會照顧到這個問題。

+0

這有點意思。我知道這段代碼很糟糕,但你不需要侮辱這個人。他非常清楚地表明,他是新手,可能還是編程整體。讓我們更公正。 – LamdaComplex

+0

@LamdaComplex - 再次閱讀Q. **這是別人的代碼,他試圖破譯**。坦率地說,「意味着」會允許那些寫出原始代碼繼續存在的人將其更多地寫在差勁的維護軟件人員身上。他們也有孩子和家人回家,而且這樣的東西永遠不會在一個令人信服的時間中斷。 –

+0

@ T.E.D。 - 完全同意生產代碼。對於原作者創建[模糊簽名生成器](http://www.iwriteiam.nl/SigProgC.html)可能是有意的努力可能有點苛刻。我很樂意僱用一個明確瞭解它爲什麼有效的人,只要他們承諾只使用這些知識。 – AShelly