揮発性のメモ2

知識をメモ書きしておく

メモリリーク

strdupが使われている個所でメモリリークが起きていた。

Man page of STRDUP
Man page of BASENAME

char *dirc, *basec, *bname, *dname;
char *path = "/etc/passwd";

dirc = strdup(path);
basec = strdup(path);
dname = dirname(dirc);
bname = basename(basec);
printf("dirname=%s, basename=%s\n", dname, bname);

まさにこれそのままのコードが使われていて、freeが抜けていたというバグ。


サンプルを参考に使うのは別に構わないが、そこに出てきた見覚えのない関数・ロジックを なんの疑問も持たずにコピペするのは言語道断だ。
「strdupってなに? まー知らんけどそのまま使お」 とか技術者として恥ずべき行為

cppcheckの使い方

apt install cppcheck
$ cd src
$ cppcheck .
・・・
Checking p_tester.cpp...
[p_tester.cpp:87]: (error) Memory leak: keep
97/99 files checked 99% done
・・・

enableオプション

--enable=warning

warning エラーになりそうな書き方の指摘
未初期化変数、型間違い、など
performance 遅そうな書き方の指摘
a++より++aだよ、未使用変数がある、など
style ダサい書き方の指摘
変数名が被ってる、C++なのにC風キャスト、など

connmanでDNSサーバを指定する

/var/lib/connman/hoge.conf にて設定する

[service_piyo]
Type=ethernet
IPv4=192.168.200.2/255.255.255.0/192.168.200.1
IPv6=off
Nameservers=192.168.200.1, 8.8.8.8   # ←★カンマ区切りで列挙する

もし、IPv4dhcpにしていたら ここに書いたDNSサーバの後ろに DHCPで貰ったnameserverが続けて設定される

注意

ひとつでもふたつでも、NameserverでなくNameservers 。 ズだズ

connmanctlでよく出るエラー

~# connmanctl disable eth0
Error eth0: Method "SetProperty" with signature "sv" on interface "net.connman.Technology" doesn't exist

テクノロジー(wifiとかethernetとか) を指定するべきところで、うっかりインターフェース(eth0)を書いてしまっている。