Secp256k1

C secp256k1:ec_pubkey_parse 在 NULL 上下文中成功,儘管屬性

  • March 5, 2017

查看secp256k1.hC 庫的主要 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,我預計該函式將失敗。當pubkeyor inputare時確實是這種情況NULL(事實上,如果我們使用 設置回調函式secp256k1_context_set_illegal_callback,它將被適當地呼叫並返回適當的返回值)。但是**,此功能在NULLcontext**上成功。有誰知道為什麼會這樣?這是預期的行為嗎?我猜這不是很重要,但我正在努力學習,當我不理解時我不喜歡它。我附上一個 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

引用自:https://bitcoin.stackexchange.com/questions/51880