2017-06-19 153 views
2

我無法爲我的生活編譯這個舊代碼。我試圖用它來測試客戶端的外部漏洞。我已經在FreeBSD 11上運行並使用gcc進行編譯。任何想法,爲什麼我得到這個錯誤?無法編譯ecepass.c

int in_cksum(u_short *addr, int len) 
{ 
    int sum; 
    int nleft; 
    u_short ans; 
    u_short *w; 

    sum = 0; 
    ans = 0; 
    nleft = len; 
    w = addr; 

    while (nleft > 1) { 
     sum += *w++; 
     nleft -= 2; 
    } 
    if (nleft == 1) { 
     *(u_char *)(&ans) = *(u_char *)w; 
     sum += ans; 
    } 
    return (sum); 
} 

全部代碼在這裏:https://pastebin.com/MGSYycmB

錯誤:

In file included from ecepass.c:8:0: ecepass.c:72:5: error: expected declaration specifiers or '...' before numeric constant int in_cksum(u_short *addr, int len)

+0

我認爲你忘了包括一些東西......開玩笑 – Stargateur

+0

@ Stargateur你看過完整的源代碼嗎?他幾乎包括*一切* :) – Barmar

+0

他包括他們一堆兩次。 – Barmar

回答

5

在張貼在引擎收錄代碼,在線#8(和#24:d)有聲明:#include <machine/in_cksum.h>

正如我在我不是的Ux,我搜索的文件在互聯網上,發現2個引用:

在兩者(大約線# 40+),好像in_cksum是預處理器宏:

#define in_cksum(m, len)  in_cksum_skip(m, len, 0) 

事實上,將函數的名稱(以及代碼中引用它的所有位置)更改爲非宏或其他已定義的標識符。 checksum(希望它還沒有定義:)),你應該沒問題(也可能適用於你的其他功能)。
或者作爲替代,刪除機器/ in_cksum.h包含(直接間接(通過其他嵌套包括)),但這可能會有點困難(也,我沒有檢查所有的代碼查看是否使用了來自include的其他函數)。

+0

這允許它編譯。非常感謝。 – sethh

+0

我沒有詳細說明,但「系統頭文件之一是將in_cksum定義爲預處理器宏」是我的恐怖嫌疑。許多BSD特定的網絡相關頭文件並沒有考慮命名空間的清晰性。 – zwol

+0

@sethh:不客氣:) – CristiFati