warning: pointer targets in passing argument 1 of ‘strcpy’ differ in signedness
警告: ‘strcpy’ の第一引数は符号が異なる
[-Wpointer-sign]
■型が違うと警告される例
#include <string.h>
typedef unsigned char UB ;
struct ctsk {
//外部インタフェースで決まっている
UB dsname[8];
} x ;
void f(UB *dsname)
{
strcpy(x.dsname,dsname);//型が違うと怒られる
}
int main(void)
{
f("dsname");//型が違うと怒られる
}
文字列の型はchar *型ですが
符号無しのchar *型(UB*型)で引数を
受け渡しているため型が違うと
コンパイラに怒られます。
■✖ コンパイラが黙るまでキャスト
void f(UB *dsname)
{
strcpy((char *)x.dsname,(char *)dsname);//キャスト
}
int main(void)
{
f((UB *)"dsname");//キャスト
}
非推奨です。
■○ 型を見直し必要最低限のキャスト
void f(char *dsname)//型の見直し
{
strcpy((char *)x.dsname,dsname);//必要最低限のキャスト
}
int main(void)
{
f("dsname");
}
型を見直し素直にchar *を使う。
外部インタフェースの制限で変更できない場合は、
必要最低限のキャストをする。
参考:
STR04-C. 基本文字集合にある文字を表すには単なる char を使用する
https://www.jpcert.or.jp/sc-rules/c-str04-c.html