マクロの罠

まぁすでにプリコンパイルだけしたものを作ってるのでそこまではまらなかったのですが。。。

SSL_METHODという構造体があってそこにSSL/TLSのVersionだったり、呼び出すべき関数のポインターが入ってたりするんですが、どこで生成されているのか追っていたらはまりました。
TLS実装のを例に見てて、d1_srvr.cにたどり着いて、dtls1_get_server_methodってのがSSL_METHODを返しているじゃないか!と。。。ここで、中で呼ばれているDTLSv1_server_methodってのがあるんですが、こいつの実装がない・・・なんで?と。

で、プリコンパイルしたものを見てみると見つかった・・・マクロで作ってるのね・・・orz

具体的には、dtls1_get_server_methodのしたに記述されている
IMPLEMENT_dtls1_meth_func(DTLSv1_server_method, dtls1_accept, ssl_undefined_function, dtls1_get_server_method)
が展開されると、マクロの第一引数が関数名になって、中でSSL_METHODを生成して返していると。。。

一説によると、crypto周りはマクロのテンプレートとかが激しいらしいので、避けますwまぁ、実際にSSL/TLSスタック部分のHandshakeがわかれば問題ないので。


ということで、OpenSSLはマクロ展開しても、しなくてもなかなかにはまりどころがありそうですw