2014-06-05 169 views
0

我發現,我已經在幾年前實施的,以及它的編譯的二進制可執行文件的舊的C源代碼。相同的C源,不同的輸出

在評論我寫的編譯命令是:

gcc -O3 source.c -o executable -lm 

所以我重新編譯,但新的可執行文件是從舊的不同(大小)。

在我辦了新的和舊的可執行文件,他們給了我不同的結果的事實:老的可執行文件返回相同的結果年前回來了,而新的返回不同的結果。

我的目標是能夠重新編譯源代碼並獲得與舊的(或至少一個可生成完全相同結果的可執行文件)相同的可執行文件。

我敢肯定,我運行兩個程序使用相同的參數,並且該代碼不會使用線程可言。唯一特別的是我需要隨機整數,但我使用自己的函數來產生它們以防止隨機數序列總是相同的(當然我總是使用相同的種子)。

unsigned int seed = 0; 
void set_srand(unsigned int aseed) { 
    seed = aseed; 
} 

int get_rand() { 
    seed = seed * 0x12345 + 0xABC123; 
    int j = (seed >> 0x10) & RAND_MAX; 
    return j; 
} 

(我以爲這是從一些圖書館複製)。

那麼它會是什麼?也許在編譯完成的OS(原之一是在WinXP下,現在我想雙方的Win7和Ubuntu下),但我一直只用MinGW的。那麼也許MinGW的版本?如果是這樣的話,我會陷入困境,因爲我不記得幾年前我使用過哪個版本。

圖書館,我用:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <math.h> 

我不只是字符串操作和計算像pow()sqrt(),乘,加/減,爲了應用啓發式優化算法來近似求解的NP-難題:結果都是問題的解決方案,但是它們的適應性是不同的。

+0

你能分享一下你的程序產生的輸出類型嗎?以及版本之間的差異究竟如何? – MultiVAC

+0

聽起來像代碼中的錯誤。依靠未定義的或實現特定的行爲? – user694733

+0

如果您需要相同的可執行文件,請使用您用於舊版本的相同版本的編譯器。如果你的程序是確定性的,但你得到了不同的結果,那麼它會暗示其中一個編譯器被竊聽(不太可能),或者你自己的代碼有未定義的行爲。舊的可執行文件是否使用調試符號編譯?嘗試在調試器中運行並查看執行發散的位置。(哎呀,只是注意到命令是在問題中,運氣不好) – user2079303

回答

1

我會檢查的第一件事是int的長度。你的代碼依賴於溢出,整數的大小可能很重要。

您的代碼似乎在暗示,int是至少32位(您使用0x0x269EC3),但也許你現在正在爲int在64位編譯。

我就不會擔心的可執行文件,這是非常不可能的,你用兩個不同的編譯器得到相同的尺寸。

+0

不,沒有「溢出」。算術是'unsigned int',它被定義爲產生一個特定的結果,以二次冪次冪爲模。我無法想象OP會不小心切換到64位。這不是。 –

+0

我沒有說這是一個未定義的行爲。 'unsigned int'情況下的溢出行爲取決於大小。我正是這個意思。 –

+0

我也沒有。我說沒有'溢出'。該標準明確指出(引號)'無符號算術不會溢出'。是的,結果取決於規模,但「溢出」仍然沒有任何與它有關的事情。 –