當前位置:首頁 » 編程軟體 » 但編譯器不做檢查

但編譯器不做檢查

發布時間: 2022-12-20 02:56:53

『壹』 為什麼編譯器不檢查數組越界

效率問題!數組用的太多了,每次都檢測越界情況,會消耗很大的系統開銷!

『貳』 c語言指針訪問越界

與編譯器無關,只與內存管理機制有關,是操作系統級別的問題,堆棧的讀取方式只是數據結構上的不同,在機器層面,依然是單純的內存讀寫操作;
數組越界訪問的危險性不好評估,但確實是最嚴重的危險之一;
結果基本上會100%崩潰,但是崩潰的原因很可能不一樣,就算是同一段越界代碼跑幾遍,原因也可能是不一樣的;
指針越界問題是不限於數組訪問的,所以全面點的解釋如下:
C語言的編譯時,會跟你的代碼需要,首先申請一塊棧空間和堆空間,棧的優先順序較高,一般時存放程序運行所必須的數據和變數,內存上是連續的,堆空間是程序運行時動態申請的空間,內存上一般是不連續的,這里說的棧與你自己創建的棧不是一個棧,不過數據結構是一樣的,只不過你自己創建的棧是靠你自己寫的代碼動態創建的,所以其實是在你程序的堆空間中的;
下面關鍵問題來了,
以上所有內存空間就是你的程序在跑起來之後,向操作系統申請的所有空間,換句話說,這些內存以外的數據,都是不屬於你這個程序的資源,當你使用指針操作的時候,如果你的指針越界了,那麼接下來你對這個指針的操作就是非法的了,如果這段空間依然是你程序內部的資源,通常會導致你程序自己崩潰,如果是程序之外的資源一般就更糟糕了,甚至會導致更高級別的崩潰,原因很多:
比如你篡改了不屬於你的數據,導致該數據所屬對象的邏輯混亂;
比如越界區域存在保護,內存空間是有讀寫許可權控制的,如果接下來你對只讀的空間進行寫操作,也會導致崩潰,windows下你會看到非常親切的藍屏;
等等...
這也是內存溢出攻擊的基本思想;

『叄』 sonarqube 分析C++ 代碼時,為什麼無法檢測出問題

有些錯誤是編譯器無法檢查的
編譯器只能檢查你語法是不是錯誤但無法檢查你演算法是否錯誤
看來可能你中間有哪步有嚴重錯誤了,以至於系統要強制關閉程序,好好檢查一下吧

『肆』 C語言的編譯器為什麼不檢查數組下標越界

以前還真沒想過,記得老師講的時候也沒說,就是強調這是C語言的歷史問題,從一開始就沒有,後來這個功能也沒有加上。至於具體的原因已知模稜兩可,今天總算查清楚了。 綜合網上的各種資料,可以得到如下的結果: 1. 在一個固定的機器之下,指針所佔的位數都是一樣的,換言之,保存的地址是有最大值的,這樣如果每次都檢查數組的越界問題,會對指針的功能做出很大的限制,因為指針只是包含地址信息並沒有包含長度的信息,比如一個 char ch[100]; char * test=ch; 之後test也可以只想超過100的長度的字元串類型,並不是局限與100。如果檢測長度,那麼就相當與限制的指針的長度,這是不合理的。 2. 沒有效率,需要付出代價。具體:最早的C編譯器並不檢查下標,而最新的編譯器依然不對它進行檢查。這項任務之所以很困難,是因為下標引用可以作為任意的指針,而不僅僅是數組名。作用於指針的下標引用的有效性既依賴於該指針當時恰好指向什麼內容,也依賴於下標的值。結果,C的下標檢查所涉及的開銷比你開始想像的要多。編譯器必須在程序中插入指令,證實下標的結果所引用的元素和指針表達式所指向的元素屬於同一個數組。這個比較操作需要程序中所有數組的位置和長度方面的信息,這將佔用一些空間。當程序運行時,這些信息必須進行更新,以反映自動和動態分配的數組,這又將佔用一定的時間。因此,即使是那些提供了下標檢查的編譯器通常也會提供一些開關,允許你去掉下標檢查。

『伍』 在java中已檢查異常和位未檢查異常是什麼二者有何區別

1、含義不同:檢查異常就是編譯器要求你必須處置的異常。不知道你編程的時候有沒有遇到過,你寫的某段代碼,編譯器要求你必須要對這段代碼trycatch,或者throwsexception。

非檢查異常是編譯器不要求強制處置的異常,雖然有可能出現錯誤,但是不會在編譯的時候檢查。

2、運行時情況不同:運行時異常都是RuntimeException類及其子類異常,如NullPointerException(空指針異常)、IndexOutOfBoundsException(下標越界異常)等,這些異常是非檢查異常,程序中可以選擇捕獲處理,也可以不處理。

這些異常一般是由程序邏輯錯誤引起的,程序應該從邏輯角度盡可能避免這類異常的發生。

運行時異常的特點是Java編譯器不會檢查它,也就是說,當程序中可能出現這類異常,即使沒有用try-catch語句捕獲它,也沒有用throws子句聲明拋出它,也會編譯通過。

運行時異常是RuntimeException以外的異常,類型上都屬於Exception類及其子類。從程序語法角度講是必須進行處理的異常,如果不處理,程序就不能編譯通過。

如IOException、SQLException等以及用戶自定義的Exception異常,一般情況下不要自定義檢查異常。

3、解決方式不同:檢查異常繼續拋出,消極的方法,一直可以拋到java虛擬機來處理,就是通過throwsexception拋出。用try...catch捕獲。注意,對於檢查的異常必須處理,或者必須捕獲或者必須拋出。

對未檢查的異常捕獲;繼續拋出;不處理。

一般是不處理的,因為你很難判斷會出什麼問題,而且有些異常你也無法運行時處理,比如空指針,需要人手動的去查找,而且,捕捉異常並處理的代價遠遠大於直接拋出。

(5)但編譯器不做檢查擴展閱讀:

所有異常類型都是Throwable類的子類,它包含Exception類和Error類,Exception又包括checkedexception和uncheckedexception。

uncheckedexception:Java編譯器不要求對未檢查異常一定捕獲或拋出,可以不做處理。此類異常通常是在邏輯上有錯誤,可以通過修改代碼避免。在eclipse中(保存即編譯)編譯後此類異常發生處會報錯。

checkedexception:Java編譯器要求對檢查異常必須捕獲或拋出,代碼邏輯沒有錯誤,但程序運行時會因為IO等錯誤導致異常,你在編寫程序階段是預料不到的。

如果不處理這些異常,程序將來肯定會出錯。所以編譯器會提示你要去捕獲並處理這種可能發生的異常,不處理就不能通過編譯。

『陸』 關於C語言,為什麼編譯器不對數組的越界進行檢查

為了提高代碼效率。
C語言跟Java不同,C的內存管理交由用戶處理,Java是語言自己處理。但是,如果不是核心系統開發,一般體現不出兩者的內存處理的代碼之間效率差別。

『柒』 (c語言)我找到問題了,編譯器沒有報錯,還可以運行,誰能解答一下

你這代碼錯了
能運行但是,不建議這樣寫,因為有歧義
%s->字元串(char[])佔位符
%c->單個字元(char)佔位符
char a;//單個字元
char s[10];//字元串
scanf("%c",&a);//輸入單個字元
scanf("%s",s);//輸入字元串
printf("%c",a);//輸出單個字元
printf("%s",s);//輸出字元串

『捌』 keil編譯器運行為什麼檢測不到錯誤

答:這種情況是你的程序還有別的錯誤,
當你把別的錯誤改掉後,再編譯你的vid 就會提示錯誤。
這種情況keil 經常有的。

『玖』 為什麼scala 編譯時異常可以不用捕獲

不用捕獲是因為Scala 編譯器不做這方面檢查啊,自然你不捕獲不拋出也能過編譯。至於為什麼Scala 編譯器不檢查異常,是因為語言設計者們認為異常不是好的錯誤處理實踐。理由如下:
1,異常會打斷執行流,因此不是類型安全的
2,異常不利於類型推斷
3,從實踐來看,大部分程序員並不會認真處理異常,不是catch下打個log就是繼續往外throw了事,結果就是又臭又長的throw
4, 丑,這是原罪。
Scala 鼓勵使用類型來表示錯誤信息,例如Option與Future ,Either, 選擇與未來(:-D),這樣控制流里你可以帶著錯誤信息一直往下走,直到一個能優雅處理錯誤的位置。

『拾』 if(-1 == argc) 是什麼情況

-1 == argc 這是一個關系表達式,判斷argc是否與 -1 相等
那為什麼不寫成 argc == -1呢
因為,如果,按照 argc==-1,效果一樣,但如果不小心寫成 argc = -1 變成一個賦值,顯然
會出現語義上的錯誤,但編譯器是不檢查語義錯誤的。這樣,顯然得不到想要的結果。
但 你這樣寫 -1 == argc,如果,你不小心寫成 -1 = argc,這是語法錯誤,編譯器會幫你檢查到出現了錯誤。以此利用編譯器來幫你避免錯誤。

熱點內容
加密貨幣app 發布:2025-07-14 20:46:57 瀏覽:553
醫院防汛演練方案與腳本 發布:2025-07-14 20:41:11 瀏覽:777
公網ip做域伺服器地址 發布:2025-07-14 20:40:13 瀏覽:52
php獲取幾 發布:2025-07-14 20:22:20 瀏覽:376
舊安卓如何刷入最新安卓 發布:2025-07-14 20:16:14 瀏覽:763
伺服器或網路不給力是什麼意思 發布:2025-07-14 20:15:36 瀏覽:318
爬網站資料庫 發布:2025-07-14 20:15:20 瀏覽:520
邵雍的演算法 發布:2025-07-14 20:13:49 瀏覽:119
離線燒錄加密 發布:2025-07-14 20:12:13 瀏覽:620
奧迪怎麼查配置 發布:2025-07-14 20:12:07 瀏覽:832