[英]How can I stub an variable/function that is declared “extern void _x”
我需要對ac文件/模塊進行單元測試,並且該文件包含:
/* Import the _x symbol from assem.S */
extern void _x;
該變量以后在該文件中用作:
#define WHAT_EVER (int)&_x
匯編文件中的減速度為:
.global _x
.type _x, @function
_x:
我在這里了解到,GCC可以使用此聲明。 但是我在這里了解到我不能簡單地聲明:
void _x;
作為我的存根,因為_x成為不完整的類型。 鏈接器實際上會報錯:'_x'的存儲大小未知 ,鏈接器正確。
但是如果我聲明:
int _x;
編譯器給我錯誤:'_x'的類型沖突 ,這也是事實。
該軟件的目標與我進行單元測試的主機不同,因此我不能包含assem.S文件(該文件不會在我的主機上編譯和/或運行)。
有誰知道對這個變量_x進行存根的方法?
GCC 5.3.1; std = gnu99; c代碼
如果您可以選擇修改引用_x
的文件,則應將此符號的訪問權限提取到其自身的文件中。 首先,我將解釋您如何做到這一點,其次,為什么要這樣做。
如何提取呢? 在測試中的現有文件中,您可以通過調用訪問函數來替換對符號的所有訪問。 也就是說,您不必使用宏WHAT_EVER
的值進行讀取,而是調用get_what_ever()
。 如果使用符號修改地址,則調用set_what_ever(value)
。 這些getter和setter函數在單獨的文件中實現(我們稱其為interface_to_assembly.c
)。 聲明放在頭文件interface_to_assembly.h
。 現在,對於目標系統,您可以編譯並鏈接修改后的文件和interface_to_assembly.c
。 對於您的測試可執行文件,您可以創建interface_to_assembly.c
的替代實現,也許是interface_to_assembly_double.c
。 這些替代實現可以是虛擬對象,存根,間諜,模擬或您需要的任何測試。
為什么推薦這種分離? 首先,它消除了要從匯編級別測試的代碼與硬件之間的緊密耦合。 其次,它用更好的可控函數接口代替了對全局變量的訪問。 但是請注意,文件interface_to_assembly.c
中的微型軟件仍然無法比以前更好地進行測試(也就是說,它將是目標系統上集成測試的候選對象)。 但是,對於其余的代碼(可能占大多數),可測試性得到了很大改善:提取變量訪問並將其替換為函數,使得無需任何匯編級代碼即可編譯代碼。 它允許控制每個單值訪問。 例如,可以創建一個測試設置,以便對getter的連續調用傳遞不同的值(如果要模擬硬件設備的並發活動,這很重要)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.