Secp256k1
C secp256k1:ec_pubkey_parse 在 NULL 上下文中成功,儘管屬性
查看
secp256k1.h
C 庫的主要 API 文件,我們有:SECP256K1_API SECP256K1_WARN_UNUSED_RESULT int secp256k1_ec_pubkey_parse( const secp256k1_context* ctx, secp256k1_pubkey* pubkey, const unsigned char *input, size_t inputlen ) SECP256K1_ARG_NONNULL(1) SECP256K1_ARG_NONNULL(2) SECP256K1_ARG_NONNULL(3);
secp256k1_ec_pubkey_parse
因此,如果三個指針參數中的任何一個為 NULL,我預計該函式將失敗。當pubkey
orinput
are時確實是這種情況NULL
(事實上,如果我們使用 設置回調函式secp256k1_context_set_illegal_callback
,它將被適當地呼叫並返回適當的返回值)。但是**,此功能在NULL
context**上成功。有誰知道為什麼會這樣?這是預期的行為嗎?我猜這不是很重要,但我正在努力學習,當我不理解時我不喜歡它。我附上一個 C 片段:#include "secp256k1.h" #include <assert.h> int main() { int return_value; secp256k1_context *ctx; secp256k1_pubkey pub; ctx = secp256k1_context_create(SECP256K1_CONTEXT_NONE); // This is a valid public key const unsigned char *pub1 = "\x03" "\xf0\x28\x89\x2b\xad\x7e\xd5\x7d\x2f\xb5\x7b\xf3\x30\x81\xd5\xcf" "\xcf\x6f\x9e\xd3\xd3\xd7\xf1\x59\xc2\xe2\xff\xf5\x79\xdc\x34\x1a"; // secp256k1_ec_pubkey_parse return_value = secp256k1_ec_pubkey_parse(ctx, &pub, pub1, 33); assert(return_value == 1); // public key is indeed valid // same call with NULL context return_value = secp256k1_ec_pubkey_parse(NULL, &pub, pub1, 33); assert(return_value == 1); // call is successfull // secp2561k1_context_destroy secp256k1_context_destroy(ctx); }
如果您查看原始碼,
secp256k1_ec_pubkey_parse
實際上並沒有使用它的ctx
參數。因此,如果它為空,則不會造成任何傷害。您可以在程式碼中看到有一個
VERIFY_CHECK
宏來測試是否ctx
為非空。但是,這僅用於測試;您可以在util.h中看到,除非定義了宏,否則實際上沒有對測試進行任何操作VERIFY
,這可能只是測試建構的情況。這裡定義的
SECP256K1_ARG_NONNULL
宏使用 GCC函式屬性機制告訴編譯器這個參數應該是非空的。編譯器會在此基礎上進行優化。如果它可以在編譯時確定參數為空,它可以嘗試發出警告;但前提是您使用該選項。-Wnonnull