相同的C源,不同的输出

时间:2014-06-05 09:25:43

标签: c++ c compilation binary mingw

我找到了几年前我已经实现的旧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;
}

(我以为这是从某些图书馆复制的。)

那又怎样呢?也许是编译完成的操作系统(最初是在WinXP下,现在我在Win7和Ubuntu下尝试),但我总是只使用 MinGW 。也许是MinGW的版本?如果是这种情况,我会遇到麻烦,因为我不记得几年前我用过哪个版本。

我使用的库:

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

我所做的只是字符串操作和计算,如pow()sqrt(),乘法和加/减,以便应用启发式优化算法来解决近似NP难问题:结果两者都是问题的解决方案,但它们的适应性不同。

1 个答案:

答案 0 :(得分:1)

我要检查的第一件事是int的大小。你的代码依赖于溢出,整数的大小可能很重要。

您的代码似乎暗示int至少为32位(您使用的是0x0x269EC3),但也许您现在正在使用64位的int进行编译。

我不担心可执行文件,你不太可能通过两个不同的编译器获得相同的大小。