C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: CppCheck VS strncpy + NELEMS


(過去ログ 129 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■76412 / inTopicNo.1)  CppCheck VS strncpy + NELEMS
  
□投稿者/ こまお (1回)-(2015/07/08(Wed) 16:28:46)

分類:[C/C++] 

#define NELEMS(a) ((int)(sizeof(a)/sizeof(a[0])))

char dst[10];
strncpy(dst, src, NELEMS(dst));

みたいなのをCppCheckに掛けると
Division by result of sizeof(). strncpy() expects a size in bytes, did you intend to multiply instead?
とワーニングが出ます。NELEMS(dst)を止めて10と書けば消えるのですが、ど
う見ても退化していると思うのでしたくありません。消し方ってありますか?



引用返信 編集キー/
■76413 / inTopicNo.2)  Re[1]: CppCheck VS strncpy + NELEMS
□投稿者/ Hongliang (321回)-(2015/07/08(Wed) 16:57:08)
> Division by result of sizeof()
ですから、sizeof()の結果を割り算していることに対する警告ですよね。
strncpyは「対象がchar*ならバイト数/wchar_t*なら文字数」とかいう訳でもなくただのchar*相手の関数なのですから、配列サイズではなく配列長を求める意味がありません。
単純にsizeof(dst)を渡せばいい話です。
引用返信 編集キー/
■76414 / inTopicNo.3)  Re[2]: CppCheck VS strncpy + NELEMS
□投稿者/ 774RR (274回)-(2015/07/08(Wed) 17:36:33)
strncpy の第3引数はバイト数=要素数なので、その警告はある意味しかたないのかもしれない。
wcsncpy の場合は要素数だし NELEMS を使うほうが妥当。

1. Windows 用ソフトなら TCHAR 対応で _tcsncpy に直して NELEMS を使い UNICODE でチェック
2. UNIX 用ソフトなら当該警告を無視(する理由を文書で残す)
というのがまっとうな対策だと思う。

引用返信 編集キー/
■76416 / inTopicNo.4)  Re[3]: CppCheck VS strncpy + NELEMS
□投稿者/ こまお (2回)-(2015/07/09(Thu) 09:09:34)
ありがとうございます。

この英語(Division by result of sizeof())ってそういう意味だったんですね(^^;

> 2. UNIX 用ソフトなら当該警告を無視(する理由を文書で残す)

このようにしていたのですが、覚えきれなくて見に行って初めて、
「あ、コレか」みたいなのを繰り返すので、なんとかしたかったです。

コード意図はこれでも十分伝わると思うのでsizeofに変えて対処しようとおもいます。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -