Điều này hiện đang chờ xử lý trong danh sách của tôi. Tóm lại - Tôi cần chạy mocked_dummy()
thay cho dummy()
TRÊN RUN-TIME, mà không sửa đổi factorial()
. Tôi không quan tâm đến điểm vào của phần mềm. Tôi có thể thêm bất kỳ số lượng chức năng bổ sung nào (nhưng không thể sửa đổi mã trong phạm vi /*---- do not modify ----*/
).Thời gian chạy chế nhạo trong C?
Tại sao tôi cần điều này?
Để thực hiện kiểm tra đơn vị của một số mô-đun C cũ. Tôi biết có rất nhiều công cụ có sẵn xung quanh, nhưng nếu chạy thời gian mocking là có thể tôi có thể thay đổi phương pháp tiếp cận UT của tôi (thêm các thành phần tái sử dụng) làm cho cuộc sống của tôi dễ dàng hơn :).
Nền tảng/Môi trường?
Linux, ARM, gcc.
Phương pháp tiếp cận mà tôi đang thử?
- Tôi biết GDB sử dụng bẫy/hướng dẫn bất hợp pháp để thêm điểm ngắt (gdb internals).
- Làm cho mã có thể tự sửa đổi được.
- Thay thế
dummy()
phân đoạn mã bằng hướng dẫn bất hợp pháp và trả lại làm hướng dẫn tiếp theo ngay lập tức. - Điều khiển chuyển để bẫy người xử lý.
- Trình xử lý bẫy là chức năng có thể tái sử dụng được đọc từ một ổ cắm miền unix.
- Địa chỉ của
mocked_dummy()
chức năng được chuyển (đọc từ tệp bản đồ). - Chức năng mô phỏng thực thi.
Có vấn đề xảy ra ở đây. Tôi cũng thấy rằng cách tiếp cận này rất tẻ nhạt và đòi hỏi số lượng mã hóa tốt, một số trong quá trình lắp ráp cũng vậy. Tôi cũng tìm thấy, dưới gcc, mỗi cuộc gọi chức năng có thể là hooked/instrumented, nhưng lại không hữu ích lắm vì chức năng được dự định sẽ được giả lập sẽ được thực hiện.
Có cách tiếp cận nào khác mà tôi có thể sử dụng không?
#include <stdio.h>
#include <stdlib.h>
void mocked_dummy(void)
{
printf("__%s__()\n",__func__);
}
/*---- do not modify ----*/
void dummy(void)
{
printf("__%s__()\n",__func__);
}
int factorial(int num)
{
int fact = 1;
printf("__%s__()\n",__func__);
while (num > 1)
{
fact *= num;
num--;
}
dummy();
return fact;
}
/*---- do not modify ----*/
int main(int argc, char * argv[])
{
int (*fp)(int) = atoi(argv[1]);
printf("fp = %x\n",fp);
printf("factorial of 5 is = %d\n",fp(5));
printf("factorial of 5 is = %d\n",factorial(5));
return 1;
}
Mã trên sẽ biên dịch như nó được? –
Mã cập nhật để mã được xây dựng. –
Nghi ngờ của tôi là nhiều hơn đối với tuyên bố này '#define dummy (m.dummy)' Làm thế nào bạn sẽ ngăn chặn preprocessor từ NOT thay thế các chức năng giả? –