糾錯碼的編譯過程
編譯錯誤信息
說明:Turbo C 的源程序錯誤分為三種類型:致命錯誤、一般錯誤和警告。其中,致命錯誤通常是內部編譯出錯;一般錯誤指程序的語法錯誤、磁碟或內存存取錯誤或命令衫瞎行錯誤等;警告則只是指出一些得懷疑的情況,它並不防止編譯的進行。
下面按字母順序A~Z分別列出致命錯誤及一般錯誤信息,英漢對照及處理方法:
(一)、致命錯誤英漢對照及處理方法:
A-B致命錯誤
Bad call of in-line function (內咐塌岩部函數非法調用)
分析與處理:在使用一個宏定義的內部函數時,沒能正確調用。一個內部函數以兩個下劃線(__)開始和結束。
Irrecable expression tree (不可約表達式樹)
分析與處理:這種錯誤指的是文件行中的表達式太復雜,使得代碼生成程序無法為它生成代碼。這種表達式必須避免使用。
Register allocation failure (存儲器分配失敗)
分析與處理:這種錯誤指的是文件行中的表達式太復雜,代碼生成程序無法為它生成代碼。此時應簡化這種繁雜的表達式或乾脆避免使用它。
(二)、一般錯誤信息英漢照及處理方法
#operator not followed by maco argument name(#運算符後沒跟宏變元名)
分析與處理:在宏定義中,#用於標識一宏變串。「#」號後必須跟一個宏變元名。
'xxxxxx' not anargument ('xxxxxx'不是函數參數)
分析與處理:在源程序中將該標識符定義為一個函數參數,但此標識符沒有在函數中出現。
Ambiguous symbol 'xxxxxx' (二義性符號'xxxxxx')
分析與處理:兩個或多個結構的某一域名相同,但具有的偏移、類型不同。在變數或表達式中引用該域而未帶結構名時,會產生二義性,此時需修改某個域名或在引用時加上結構名。
Argument # missing name (參數#名丟失)
分析與處理:參數名已脫離用於定義函數的函數原型。如果函數以原型定義,該函數必須包含所有的參數名。
Argument list syntax error (參數表出現語法錯誤)
分析與處理:函數調用的參數間必須以逗號隔開,並以一個右括弧結束。若源衡御文件中含有一個其後不是逗號也不是右括弧的參數,則出錯。
Array bounds missing (數組的界限符"]"丟失)
分析與處理:在源文件中定義了一個數組,但此數組沒有以下右方括弧結束。
Array size too large (數組太大)
分析與處理:定義的數組太大,超過了可用內存空間。
Assembler statement too long (匯編語句太長)
分析與處理:內部匯編語句最長不能超過480位元組。
Bad configuration file (配置文件不正確)
分析與處理:TURBOC.CFG配置文件中包含的不是合適命令行選擇項的非註解文字。配置文件命令選擇項必須以一個短橫線開始。
Bad file name format in include directive(包含指令中文件名格式不正確)
分析與處理:包含文件名必須用引號("filename.h")或尖括弧(<filename>)括起來,否則將產生本類錯誤。如果使用了宏,則產生的擴展文本也不正確,因為無引號沒辦法識別。
Bad ifdef directive syntax (ifdef指令語法錯誤)
分析與處理:#ifdef必須以單個標識符(只此一個)作為該指令的體。
Bad ifndef directive syntax (ifndef指令語法錯誤)
分析與處理:#ifndef 必須以單個標識符(只此一個)作為該指令的體。
Bad undef directive syntax (undef指令語法錯誤)
分析與處理:#undef指令必須以單個標識符(只此一個)作為該指令的體。
Bad file size syntax (位欄位長語法錯誤)
分析與處理:一個位欄位長必須是1—16位的常量表達式。
Call of non-functin (調用未定義函數)
分析與處理:正被調用的函數無定義,通常是由於不正確的函數聲明或函數名拼錯而造成。
Cannot modify a const object (不能修改一個長量對象)
分析與處理:對定義為常量的對象進行不合法操作(如常量賦值)引起本錯誤。
Case outside of switch (Case 出現在switch外)
分析與處理:編譯程序發現Case語句出現在switch語句之外,這類故障通常是由於括弧不匹配造成的。
Case statement missing (Case語句漏掉)
分析與處理:Case語必須包含一個以冒號結束的常量表達式,如果漏了冒號或在冒號前多了其它符號,則會出現此類錯誤。
Character constant too long (字元常量太長)
分析與處理:字元常量的長度通常只能是一個或兩個字元長,超過此長度則會出現這種錯誤。
Compound statement missing (漏掉復合語句)
分析與處理:編譯程序掃描到源文件未時,未發現結束符號 (大括弧),此類故障通常是由於大括弧不匹配所致。
Conflicting type modifiers (類型修飾符沖突)
分析與處理:對同一指針,只能指定一種變址修飾符(如near 或far);而對於同一函數,也只能給出一種語言修飾符(如Cdecl、pascal或interrupt)。
Constant expression required (需要常量表達式)
分析與處理:數組的大小必須是常量,本錯誤通常是由於#define常量的拼寫錯誤引起。
Could not find file 'xxxxxx.xxx' (找不到'xxxxxx.xx'文件)
分析與處理:編譯程序找不到命令行上給出的文件。
Declaration missing (漏掉了說明)
分析與處理:當源文件中包含了一個struct或 union域聲明,而後面漏掉了分號,則會出現此類錯誤。
Declaration needs type or storage class(說明必須給出類型或存儲類)
分析與處理:正確的變數說明必須指出變數類型,否則會出現此類錯誤。
Declaration syntax error (說明出現語法錯誤)
分析與處理:在源文件中,若某個說明丟失了某些符號或輸入多餘的符號,則會出現此類錯誤。
Default outside of switch (Default語句在switch語句外出現)
分析與處理:這類錯誤通常是由於括弧不匹配引起的。
Define directive needs an identifier (Define指令必須有一個標識符)
分析與處理:#define 後面的第一個非空格符必須是一個標識符,若該位置出現其它字元,則會引起此類錯誤。
Division by zero (除數為零)
分析與處理:當源文件的常量表達式出現除數為零的情況,則會造成此類錯誤。
Do statement must have while (do語句中必須有While關鍵字)
分析與處理:若源文件中包含了一個無While關鍵字的 do語句,則出現本錯誤。
DO while statement missing ( (Do while語句中漏掉了符號 "(")
分析與處理:在do語句中,若 while關鍵字後無左括弧,則出現本錯誤。
Do while statement missing;(Do while語句中掉了分號)
分析與處理:在DO語句的條件表達式中,若右括弧後面無分號則出現此類錯誤。
Duplicate Case (Case情況不唯一)
分析與處理:Switch語句的每個case必須有一個唯一的常量表達式值。否則導致此類錯誤發生。
Enum syntax error (Enum語法錯誤)
分析與處理:若enum說明的標識符表格式不對,將會引起此類錯誤發生。
Enumeration constant syntax error (枚舉常量語法錯誤)
分析與處理:若賦給enum類型變數的表達式值不為常量,則會導致此類錯誤發生。
Error Directive : xxxx (Error指令:xxxx)
分析與處理:源文件處理#error指令時,顯示該指令指出的信息。
Error Writing output file (寫輸出文件錯誤)
分析與處理:這類錯誤通常是由於磁碟空間已滿,無法進行寫入操作而造成。
Expression syntax error (表達式語法錯誤)
分析與處理:本錯誤通常是由於出現兩個連續的操作符,括弧不匹配或缺少括弧、前一語句漏掉了分號引起的。
Extra parameter in call (調用時出現多餘參數)
分析與處理:本錯誤是由於調用函數時,其實際參數個數多於函數定義中的參數個數所致。
Extra parameter in call to xxxxxx(調用xxxxxxxx函數時出現了多餘參數)
File name too long (文件名太長)
分析與處理:#include指令給出的文件名太長,致使編譯程序無法處理,則會出現此類錯誤。通常DOS下的文件名長度不能超過 64個字元。
For statement missing ) (For語名缺少")")
分析與處理:在 for語句中,如果控製表達式後缺少右括弧,則會出現此類錯誤。
For statement missing( (For語句缺少"(")
For statement missing; (For 語句缺少";")
分析與處理:在 for語句中,當某個表達式後缺少分號,則會出現此類錯誤。
Function call missing) (函數調用缺少")")
分析與處理:如果函數調用的參數表漏掉了右手括弧或括弧不匹配,則會出現此類錯誤。
Function definition out ofplace (函數定義位置錯誤)
Function doesn't take a variable number of argument(函數不接受可變的參數個數)
Goto statement missing label (Goto語句缺少標號)
If statement missing( (If語句缺少"(")
If statement missing) (If語句缺少")")
lllegal initalization (非法初始化)
lllegal octal digit (非法八進制數)
分析與處理:此類錯誤通常是由於八進制常數中包含了非八進制數字所致。
lllegal pointer subtraction (非法指針相減)
lllegal structure operation (非法結構操作)
lllegal use of floating point (浮點運算非法)
lllegal use of pointer (指針使用非法)
Improper use of a typedef symbol (typedef符號使用不當)
Incompatible storage class (不相容的存儲類型)
Incompatible type conversion (不相容的類型轉換)
Incorrect commadn line argument:xxxxxx (不正確的命令行參數:xxxxxxx)
Incorrect commadn file argument:xxxxxx (不正確的配置文件參數:xxxxxxx)
Incorrect number format (不正確的數據格式)
Incorrect use of default (deflult不正確使用)
Initializer syntax error (初始化語法錯誤)
Invaild indrection (無效的間接運算)
Invalid macro argument separator (無效的宏參數分隔符)
Invalid pointer addition (無效的指針相加)
Invalid use of dot (點使用錯)
Macro argument syntax error (宏參數語法錯誤)
Macro expansion too long (宏擴展太長)
Mismatch number of parameters in definition(定義中參數個數不匹配)
Misplaced break (break位置錯誤)
Misplaced continue (位置錯)
Misplaced decimal point (十進制小數點位置錯)
Misplaced else (else 位置錯)
Misplaced else driective (clse指令位置錯)
Misplaced endif directive (endif指令位置錯)
Must be addressable (必須是可編址的)
Must take address of memory location (必須是內存一地址)
No file name ending (無文件終止符)
No file names given (未給出文件名)
Non-protable pointer assignment (對不可移植的指針賦值)
Non-protable pointer comparison (不可移植的指針比較)
Non-protable return type conversion (不可移植的返回類型轉換)
Not an allowed type (不允許的類型)
Out of memory (內存不夠)
Pointer required on left side of (操作符左邊須是一指針)
Redeclaration of 'xxxxxx' ('xxxxxx'重定義)
Size of structure or array not known (結構或數組大小不定)
Statement missing; (語句缺少「;」)
Structure or union syntax error (結構或聯合語法錯誤)
Structure size too large (結構太大)
Subscription missing ] (下標缺少『]』)
Switch statement missing ( (switch 語句缺少"(")
Switch statement missing ) (switch 語句缺少")")
Too few parameters in call (函數調用參數太少)
Too few parameter in call to'xxxxxx'(調用'xxxxxx'時參數太少)
Too many cases (Cases太多)
Too many decimal points (十進制小數點太多)
Too many default cases (defaut太多)
Too many exponents (階碼太多)
Too many initializers (初始化太多)
Too many storage classes in declaration (說明中存儲類太多)
Too many types in decleration (說明中類型太多)
Too much auto memory in function (函數中自動存儲太多)
Too much global define in file (文件中定義的全局數據太多)
Two consecutive dots (兩個連續點)
Type mismatch in parameter # (參數"#"類型不匹配)
Type mismatch in parameter # in call to 'XXXXXXX' (調用'XXXXXXX'時參數#類型不匹配)
Type missmatch in parameter 'XXXXXXX' (參數'XXXXXXX'類型不匹配)
Type mismatch in parameter 'YYYYYYYY' in call to 'YYYYYYYY'(調用'YYYYYYY'時參數'XXXXXXXX'數型不匹配)
Type mismatch in redeclaration of 'XXX' (重定義類型不匹配)
Unable to creat output file 'XXXXXXXX.XXX' (不能創建輸出文件'XXXXXXXX.XXX')
Unable to create turboc.lnk (不能創建turboc.lnk )
Unable to execute command 'xxxxxxxx'(不能執行'xxxxxxxx'命令)
Unable to open include file 'xxxxxxx.xxx' (不能打開包含文件'xxxxxxxx.xxx')
Unable to open inputfile 'xxxxxxx.xxx' (不能打開輸入文件'xxxxxxxx.xxx')
Undefined label 'xxxxxxx' (標號'xxxxxxx'未定義)
Undefined structure 'xxxxxxxxx' (結構'xxxxxxxxxx'未定義)
Undefined symbol 'xxxxxxx' (符號'xxxxxxxx'未定義)
Unexpected end of file in comment started on line #(源文件在某個注釋中意外結束)
Unexpected end of file in conditional stated on line # (源文件在#行開始的條件語句中意外結束)
Unknown preprocessor directive 'xxx' (不認識的預處理指令:'xxx')Untermimated character constant (未終結的字元常量)
Unterminated string (未終結的串)
Unterminated string or character constant(未終結的串或字元常量)
User break (用戶中斷)
Value required (賦值請求)
While statement missing ( (While語句漏掉 '(')
While statement missing ) (While語句漏掉 ')')
Wrong number of arguments in of 'xxxxxxxx' (調用'xxxxxxxx'時參數個數錯誤)
Ⅱ gcc編譯錯誤!
提示是說編譯的時候加上參數-fPIC,和你做的完全不一樣。
當輸入文件為.c、.cxx、.cpp等等時,gcc先編譯後鏈接
當輸入文件是.o時gcc只執行連接步驟。
應該的命令行類似:
gcc -c -fPIC palindrome.c -o palindrome.o
Ⅲ 用eclipse 編寫java代碼時,他為什麼能自動識別語法錯誤及給出正確的寫法這是JAVA編譯器的哪種特性
這是靠eclipse自帶的插件實現的,的確屬於靜態分析。動態分析我不太了解,可能會涉及到jvm,但主要是在編譯器內獲取一些動態信息,如果想對java的多態進行分析就需要動態分析,即在編譯時獲取具體調用的類的信息。但如果是問eclipse的語法糾錯,遠沒涉及那麼高級的內容。
如果你去看eclipse文件夾下的plugins文件夾,你能找到類似org.eclipse.jdt.XXX.XXX的若干jar文件,那些包就是eclipse專門用以處理java代碼分析工作的jdt插件工具包。他能抽取java代碼的AST(抽象語法樹),也就是編譯時用到的數據結構,你若學過編譯原理就知道了,反正我還沒學。如果做一些java方面的逆向工程,你甚至可以引用eclipse的jdt包,將java項目的代碼通過相應介面(你可以在網上找到jdt的api和實例代碼)傳進去,獲取代碼中的類,欄位,方法,和更細節的信息。
而jdt中也包含檢測,處理語法錯誤的包,可以發現並糾正語法錯誤。這一特點還可以用來做一些正向工程(如自修改或動生成代碼)。
哦,還有,針對你的問題還要說,這點特性不是編譯器的,而是編輯器eclipse的。注意,絕對是編輯器的特點!雖然涉及到語法問題,但在eclipse糾錯時,還沒有調用編輯器,即程序還沒有編輯。只有在運行程序前eclipse才會調用編輯器。編譯一次不容易,每次糾錯都調用編譯器的話開銷太大,糾錯的反應速度絕對不會像平時eclipse做的那麼快。
實際上eclipse可以說就是由各種插件組成的,它本身只提供一個供各種插件運行的平台,本身功能很簡單,但就是通過向jdt這樣的插件包實現各種復雜的功能。
Ⅳ 如何反編譯一個exe文件,並修改裡面一句代碼
1、首先打開瀏覽器,網路搜索「反編譯工具ILSpy」,選擇一個安全的網站進行下載。
Ⅳ 如何對待c語言編程中的錯誤
這時很正常的問題.打代碼沒有bug才不正常.但是編譯時的錯誤還是比較容易避免的,常見的可以通過以下幾種方法解決
語法錯誤:比如說變數名打錯,少一個分號,括弧之類的錯誤,經過你不斷的打代碼,這樣的錯誤慢慢就會減少了.
編譯出錯時,一半的方法是將問題從上到下一個一個解決.因為第一個錯誤可能引發後面的很多錯誤.因此你每次只需要留意第一個錯誤.很多情況下,第一個錯誤解決了,後面的錯誤自然迎刃而解.
編譯出錯時,編譯器通常會提示出錯的行號.尋找錯誤一半從出錯的行號往上找,不需要往下找,看看編譯錯誤的原因是什麼,遇到不懂的單詞可以查查,以後就明白了.因為錯誤就那麼幾個,錯來錯去還是那幾個.
建議寫程序的時候,不要等全部代碼打完之後再一次性編譯.可以分模塊,分函數寫.寫完一個之後,嘗試著編譯,看看有沒有問題,即使有問題,尋找起來也相對會方便一點.不必大海撈針.
至於運行時的bug,這需要隨著你的代碼量的提高而減少(相對).解決bug的常用方法是debug(調試),具體調試的方法因為不同的開發環境而不同.你可以根據你的開發環境查閱相應的debug文檔.