Linux で libc の strerror_r 関数を使用しています。バッファー ポインターとバッファー サイズの引数に 0 を指定して呼び出すと、エラー メッセージと共に文字列へのポインターが返されます。
後で使用するために文字列のコピーを作成しますが、返されたポインターをどうするか? このポインターを何らかの方法で解放する必要がありますか?それとも静的メッセージ テーブルを指していますか?
の (GNU、非 Posix) バージョンによって返される文字列は、strerror_r
常に静的文字列か、指定したバッファのいずれかです。ほとんどの場合、静的文字列になります。errno
エラー文字列は、 の値が不明な場合にのみ動的に作成されます。
バッファ サイズに 0 を指定すると、バッファは使用されません。必要な場合は引き続き返されます。つまり、あなたの場合、呼び出しの結果として 0 を受け取る可能性があることを意味しますstrerror_r
。それはおそらくあなたが意図したものではありません。
の Posix バージョンはstrerror_r
常に指定したバッファを使用し、何らかのエラーが発生しない限り 0 を返します (バッファが不足するとエラーになるため、Posix バージョンでバッファを 0 に指定すると、エラーが返されることが保証されます。これは -- 副作用として -- の以前の値を破壊しますerrno
。
要するに:
バッファー長 0 での呼び出しstrerror_r
は正しくありませんが、その関数の Gnu 固有のバージョンを使用する場合、ほとんどの場合問題になりません。
バッファでない限り、文字列をコピーする必要はありません。strerror_r の Posix 互換バージョンでは、静的文字列が使用可能かどうかを知ることができないため、常にバッファーをコピーすることになります。