たとえば、次のような C API があるとします。
// configure various parameters
int set_option(const char* name, const char* value);
// callback invoked during long running operation
typedef int (*callback_t)(void* whatever);
// start a long running operation
int some_long_operation(callback_t callback);
これらの関数は、再入可能ではないと文書化されています。これを強制する必要がありますか (たとえば、どこかにフラグを設定し、適切なエラー コードを返すことによって)、またはオフの場合は未定義の動作として記述する必要がありますか? 私が見たコードのほとんどは、これを試みていません。それが意識的な決定なのか、それとも単なるプラグマティズム (あるいは怠惰) なのか、私はただ疑問に思っています。本当に堅牢なコードを書きたい場合は、次のようなことを試してください。一方、ドキュメントに従っていない場合は、おそらくすべての賭けをオフにする必要があります。
SDK の保守を担当するチームの一員として、私の経験は時々恐ろしいものでした。確かに私たちのドキュメンテーションは素晴らしいものではありませんが、OEM のサポート リクエストでかなり奇妙なことがいくつか見られました。それらのかなりの数は、別の関数によって呼び出されたコールバックのコンテキストで関数を呼び出すことから生じます。これらのほとんどはサポートされていないと文書化されていますが、それを防ぐためのコードはありません。実際、これのほとんどのインスタンスは機能しているように見えますが、実際に内部状態を台無しにするものもあります。人にドキュメントを読んでもらうよりも、適切な API の使用を強制する方が簡単な場合があるようです。