0

スレッド セーフティと一般的なセキュリティの観点から、次のコードに何か問題がありますか?

std::string & toHexString( const uint8_t *buf, uint32_t size, std::string &out ) 
{ 
  // modify 'out'
  return out; 
}

#ifndef TOHEXSTR
    #define TOHEXSTR( x, y, ) ( toHexString( x, y, std::string() ) ).c_str()
#endif

これを使用する方法は、デバッグ ステートメントを出力することです。

printf( "Byte buffer contents: [%s].", TOHEXSTR( buf, buf_size ) );

この実装に問題がある場合、何を変更する必要がありますか?

ありがとう。

4

2 に答える 2

2

出力を格納するために参照パラメーターを使用しないでください。

関数内にローカル std::string を作成し、それを値で返すだけです。

std::string  toHexString( const uint8_t *buf, uint32_t size ) 
{ 
  std::string out;
  // modify 'out'
  return out; 
}

Return Value Optimizationなどのコンパイラ技術により、これは同様のパフォーマンスを持つはずですが、セマンティクスははるかに優れています (ダミーの追加パラメーターは必要ありません)。

スレッドセーフに関する限り、関数はおそらく問題ありません。スレッド間でデータが共有されている場合にのみ、スレッドの安全性について心配する必要があります。この関数はデータを共有すべきではありません。

于 2012-09-17T17:57:19.247 に答える
0

outご覧のとおり、その関数自体には特定のスレッド セーフの問題はありません。そのため、実行中におよびパラメータの内容がbuf別のスレッドによって変更されない限り問題ありません。そのマクロを介して使用する場合、または同様に、心配する必要はありませんout-ただし、イーサンの回答ノートのように、マクロをいじるのではなく、よりクリーンな関数を作成して文字列を返すだけの方がはるかに優れています.

于 2012-09-17T19:07:48.760 に答える