記錄乙個詭異的函式呼叫返回錯誤的指標bug

2021-08-20 09:01:36 字數 563 閱讀 8057

#include "test.h" void main()

typedef struct s_ s;

s* s_array[10];

#include "test.h" s* get_struct_s() 

在大型程式中,複雜的makefile可能會通過上面這種project(即能夠編譯成功),但是在執行過程中printf語句會crush,經過gdb定位,是get_struct_s返回了乙個錯誤的指標。但是,這個指標在get_struct_s內部的時候是正確的。例如正確的指標是0xaa12345678,返回之後變成了0xffffffff12345678,經過比較可以明顯看出後四個位元組是相同的,函式返回時正確的指標被截斷為4個位元組了。

原因是test.h中沒有宣告get_struct_s函式,編譯器為get_struct_s函式的返回值預留了4個位元組,但是實際返回的指標大於4個位元組,產生了截斷,這種bug很不容易察覺。

解決方法是在test.h中宣告函式。

乙個看似詭異的錯誤

先上 客戶端 如下 include include include include include void str cli file stream,int fd int main int argc,char argv int socket fd 5 int i for i 0 i 5 i str ...

記錄乙個ssl證書引發的詭異問題

這個問題,首先想到的是公司的網路策略是否限制了部分ip的訪問 其次想到公有雲和私有雲部署的版本是否有差異。兜兜轉轉除錯了大約乙個星期,最終發現問題竟然出在證書上!一 證書完整性檢測 配置在閘道器上的crt和rsa證書是我用ssl相關命令自己將公司的pfx格式證書轉換成的,而在執行過程中,不可避免地缺...

函式呼叫返回值是乙個閉包

返回值型別資料 函式返回值 返回閉包函式 引用型別資料 函式返回值是乙個閉包函式,就是引用型別的資料。則每一次呼叫該函式,都會建立乙個記憶體空間。如果函式返回值是值型別資料,則每一次呼叫該函式,不會建立乙個新的記憶體空間。不管函式返回值是什麼,引用該函式 都不會建立乙個新的記憶體空間。當引用函式時,...