2016-04-14 85 views
1

我使用的代碼塊時:獲取分割故障運行的發行版本,而不是調試版本代碼塊

Release 13.12 rev 9501 (2013-12-25 18:25:45) gcc 4.8.2 Linux/unicode - 64 bit 

在以下系統:

Linux Mint 17.3 Cinnamon (version 2.8.7) 64-bit 
Intel Core i7-4790 
NVIDIA GeForce GTX 750 Ti 

當我設置選擇目標「調試」並運行我的代碼,它完美的工作。我已經運行了很多次,沒有任何問題。但是,當我選擇「釋放」目標並經常從命令提示符運行程序時,會出現分段錯誤。

我的C++程序大約有一千行,我不知道程序的哪一部分導致了分段錯誤。所以我不知道在這個階段哪個代碼是相關的(當我有更多的信息時,我會在這裏發佈一些代碼)。它確實利用指針和動態數據結構。我猜測有些東西沒有被正確初始化,但是我不知道如何去調試「Release」版本。我沒有改變任何編譯器或鏈接器設置的默認值。 「版本」版本中可能會有什麼不同導致此問題?

(更新)按照Nathan的建議,我能夠找出分段故障。有一個for循環,但在這個循環中的某些情況下上限(終點指標)沒有被初始化,沿着線:

void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[]) 
{ 
    int idx, end_idx; 
    if (test_val > inp_val) 
     end_idx = someFn(inp_val, lim_idx, xarr); 
    if (!var_val) 
     for (idx = st_idx; idx <= end_idx; idx++) 
      xarr[idx] = 0; 
} 

我能解決這個問題,通過初始化的「end_idx 「變到零(」 st_idx」總是大於一):

void fnProc(bool var_val, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[]) 
{ 
    int idx, end_idx; 
    if (test_val > inp_val) 
     end_idx = someFn(inp_val, lim_idx, xarr); 
    else 
     end_idx = 0; 
    if (!var_val) 
     for (idx = st_idx; idx <= end_idx; idx++) 
      xarr[idx] = 0; 
} 

是否有可能獲得代碼塊/ GCC編譯器,當一個變量沒有被初始化這樣發出警告?我看到有一個GCC選項: - 初始化,但我沒有看到這在Code Blocks中。

+3

使用一些'cout'語句來標記代碼塊。一旦你錯了,你至少應該知道什麼阻止了它,然後你從那裏縮小它的範圍。但你是對的。這很可能意味着你的代碼中有一些UB。 – NathanOliver

回答

2

當變量 尚未像這樣初始化時,是否可以讓代碼塊/ GCC編譯器發出警告?我看到有一個GCC選項:-Wuninitialized, 但我沒有看到這個代碼塊

您可以添加不可從編譯器設置任何編譯器選項 - >編譯器標誌 菜單從工作區樹視圖導航你的項目 - >構建選項 - > {調試|版本} - >編譯器設置 - >其他編譯器選項 並將它們列在文本框中。

然而,沒有必要以這種方式添加-Wuninitialized因爲它 由-Wall啓用,並通過與通常的發行代碼挑起建設 優化-O2(或任何高於-O0): -

foo.cpp

extern int someFn(int, int, int[]); 

void fnProc(bool var, int inp_val, int test_val, int st_idx, int lim_idx, int xarr[]) 
{ 
    int idx, end_idx; 
    if (test_val > inp_val) 
     end_idx = someFn(inp_val, lim_idx, xarr); 
    if (!var) 
     for (idx = st_idx; idx <= end_idx; idx++) 
      xarr[idx] = 0; 
} 

用g ++ 5。2:

$ g++ -O2 -Wall -c foo.cpp 
foo.cpp: In function ‘void fnProc(bool, int, int, int, int, int*)’: 
foo.cpp:5:14: warning: ‘end_idx’ may be used uninitialized in this function [-Wmaybe-uninitialized] 
    int idx, end_idx; 
      ^

這個擁有良好的背部至少可以追溯到GCC 4.4.7

-Wall從代碼::塊啓用編譯器設置 - >編譯器標誌菜單 通過滴答項目警告 - >啓用所有常見的編譯器警告

代碼:: Blocks的16.01(這是我目前有),即使該設置是不必要的,因爲 爲-Wall都啓用調試,默認情況下發布配置, 因此警告正式出現在默認代碼:: Blocks的控制檯項目的foo.cpp發佈版本 : -

-------------- Build file: Release in deleteme (compiler: GNU GCC Compiler 5.2)--------------- 

g++-5 -Wall -fexceptions -O2 -c /home/imk/develop/deleteme/foo.cpp -o obj/Release/foo.o 
/home/imk/develop/deleteme/foo.cpp: In function ‘void fnProc(bool, int, int, int, int, int*)’: 
/home/imk/develop/deleteme/foo.cpp:5:14: warning: ‘end_idx’ may be used uninitialized in this function [-Wmaybe-uninitialized] 
    int idx, end_idx; 
      ^
Process terminated with status 0 (0 minute(s), 0 second(s)) 
0 error(s), 1 warning(s) (0 minute(s), 0 second(s)) 

至於我記得,-Wall一直在 代碼::塊爲6年左右,我用它默認的GCC選項,但也許我我錯了。

相關問題