6

nullにポインタを渡すとクラッシュが発生しますdlclose

呼び出す前にnullをチェックする必要がありますdlcloseか?

POSIXはこれについて何も伝えていません:http: //pubs.opengroup.org/onlinepubs/7908799/xsh/dlclose.html

それは未定義の動作ですか、dlcloseそれとも実装のバグですか?

4

3 に答える 3

5

これはトリッキーです。POSIX は次のように述べています。

handle開いているオブジェクトを参照していない場合はdlclose()、ゼロ以外の値を返します

そこから、任意のポインターについて、そのポインターが開いているオブジェクトを参照しているかどうかを検出する必要があると推測できます。Linux/Glibc バージョンではそのようなチェックは行わないようですNULL

[さておき、Linux のマンページもあまり役に立ちません。関数の動作については非常に暗黙的libdlであり、適合性を明確に主張することなく POSIX に準拠しています。]

于 2012-07-10T12:19:12.947 に答える
1

また、 a を受け入れてクラッシュしNULLないことについても何も述べていません。テストから、明示的なNULLチェックを行わず、何らかの方法でポインターを使用して終了アクションを実行する必要があると推測できます。

于 2012-07-10T12:20:32.597 に答える
1

malloc/慣例 (1) に従うfreeと、バグです。fopen/fclose規則 (2)に従っている場合、そうではありません。したがって、バグがある場合は、ゾンビを処理するための規則がないため、標準に含まれています。

  • 規則 (1) は C++11 の移動セマンティクスでうまく機能します
  • 規則 (2) は、より多くの責任を呼び出し元に任せます。特に、移動操作が行われた場合、dtor は null を明示的にチェックする必要があります。

これは、混乱を避けるために、今後の POSIX リビジョンで修正する必要があると思います。


アップデート

この回答から見つけましたhttps://stackoverflow.com/a/6277781/877329、そして無効なtidでman pthread_join呼び出すことができることを読んで、慣例をサポートしています。ダイナミック ローダー インターフェイスに関して私が見つけたもう 1 つの問題は、標準のエラー処理システムを使用せず、独自の機能を持っていることです。pthread_joinmalloc/freedlerror

于 2015-07-03T09:38:47.767 に答える