strcpyとstrncpyで、どっちがベター?

以下の関数はバッファーオーバーランを起こす可能性があるので、使うべきではなく、→で示したほうの関数を使うべきとよく言われる。

  • sprintf → snprintf
  • strcat → strncat
  • strcpy → strncpy
  • vsprintf → vsnprintf

しかし、strncpyが安全かというと、そうでもなくて終端文字を含まない文字列を作り出してしまう可能性があります。

strncpy(dest, src, len)

とした場合、srcの長さがlenを超える場合、NULL文字で終端されない文字列を生成してしまいます。
すると、その文字列は、終端文字列がないために、sprintfなどで、処理が突っ走ってしまい、大規模な領域破壊を起こす可能性があります。

より厳密にやるならば、strncpyをラップして、my_strncpyを作るとか、strncpy、もしくは、strcpyを使う直前にはかならずASSERTチェックを入れるとかすべきなんだと思います。
とは言いつつも、自分は、めんどくさくて、普通にstrncpyとか使ってしまうことが多いですが…。