簡體   English   中英

如何存根聲明為“ extern void _x”的變量/函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM