我正在研究如何將完整的腳本支持集成到我的應用程序中,但在計劃我的C API成爲LUA友好程序時遇到了一些問題。如何爲LUA創建安全的C接口
基本上我得到了通過init和免費 功能創建這樣結構的一串:
[test.h]
typedef struct
{
char name[ 50 ];
} Test;
Test *TestAdd(char *name);
Test *TestDelete(Test *test);
[test.c的]
Test *TestAdd(char *name)
{
Test *test = (Test *) calloc(1, sizeof(Test));
strcpy(test->name, name);
return test;
}
Test *TestDelete(Test *test)
{
free(test);
return NULL;
}
我使用swig生成LUA模塊,因此我創建了以下接口文件:
[test.i]
%module test
%{
%}
Test *TestAdd(char *name);
Test *TestDelete(Test * test);
一切都正常工作,如果用戶代碼是這樣的:
a = test.TestAdd("test")
a = test.TestDelete(a)
if(a != nil) print(a.name)
但是,如果用戶代碼是這樣的:
a = test.TestAdd("test")
test.TestDelete(a)
if(a != nil) print(a.name) -- Crash the app with bad_access (not just a LuaVM error).
甚至最差:
a = test.TestAdd("test")
test.TestDelete(a)
test.TestDelete(a)
-- Another way of making crash my app completely!
有沒有我可以在C中創建一組API來避免這種問題,並且可以讓用戶以安全的方式安全地添加/刪除和訪問屬性,從而不會產生「不良訪問」錯誤並使整個程序崩潰,最好的辦法就是LUAVM只是返回一個錯誤並繼續執行。
我一直在尋找和嘗試不同的方法,我的C API來避免這個問題,但失敗了......
任何人都可以幫助我或者給我一些指點關於要去的方向與此有關。
由於提前,
如果您可以將指針設置爲NULL,那麼將它釋放兩次不會成爲問題,您只需在每個使用它的函數中檢查它是否爲NULL即可。 – 2011-12-16 02:48:37