Armadilloフォーラム

Linuxカーネルビルド時にワーニングが発生する

miyamoto

2018年11月14日 14時18分

お世話になります。宮本と申します。
件名のとおりlinux-v4.14-at7からビルドを行うと以下のソースのコンパイルでワーニングが発生しています。
linux-v4.14-at7/drivers/net/wireless/awl13
・awl13_usbdrv.c
・awl13_ioctl.c
ソースファイルを確認するとArmadillo-WLANのAWL13デバイスドライバ(v3.0.2-3)から同様の状態のようなのですが、
このままで問題ないようなものか、ご確認いただけないでしょうか。
なお、最新のlinux-v4.14-at8でも同様にワーニングが発生しています。

【作業環境】
製品:Armadillo-640
OS:Debian stretch
Linux:4.14-at7 (atmark@atde7) (gcc version 6.3.0 20170516 (Debian 6.3.0-18))

【ワーニングメッセージ(抜粋)】
drivers/net/wireless/awl13/awl13_usbdrv.c: In function ‘awl13_port_status’:
drivers/net/wireless/awl13/awl13_usbdrv.c:1252:5: warning: this ‘if’ clause does not guard... [-Wmisleading-indentation]

drivers/net/wireless/awl13/awl13_ioctl.c: In function ‘awl13_ip_getwidstr’:
drivers/net/wireless/awl13/awl13_ioctl.c:1819:1: warning: the frame size of 1040 bytes is larger than 1024 bytes [-Wframe-larger-than=]

---
awl13_usbdrv.c
コンパイラが字下げまでチェックしているのか、{}がないことで意図したものかのチェックがされているように
見受けられます。
「return 0」をifと同じ位置に合わせるとワーニングが解消されました。
(試してませんが{}を付けることでもワーニングは解消されると思われます。)

if(psta)
*psta = priv->port_status;
return 0; <--------- ここの字下げをチェック?

awl13_ioctl.c
1024byte確保されている変数に対してそれを超える内容が代入されていることでチェックされているように見受けられます。
あまりソースを追えてませんが、以下の変数の値を適当に変更するとワーニングが解消されました。

awl13_ip_setwidstr(struct net_device *dev, struct iw_request_info *info,
struct iw_point *wri, char *extra)
(中略)
unsigned char action_req[1024]; <--------- ここを1000に変更するとワーニングが解消

※awl13_ip_getwidstrでも同様のワーニングが発生しており、そちらも変数の要素数を変更すると解消されます。

ワーニングのみ抜粋したものと、適当に修正したソースファイル(//--2018/11/14でマークしてます)を添付いたします。

以上です。よろしくお願いします。

ファイル ファイルの説明
20181114_資料.zip
コメント

at_mizo

2018年11月14日 14時54分

溝渕です。

必ず警告の出てしまうソースをリリースしてしまい、大変申し訳ございません。

> awl13_usbdrv.c
> コンパイラが字下げまでチェックしているのか、{}がないことで意図したものかのチェックがされているように
> 見受けられます。
> 「return 0」をifと同じ位置に合わせるとワーニングが解消されました。
> (試してませんが{}を付けることでもワーニングは解消されると思われます。)
>
> if(psta)
> *psta = priv->port_status;
> return 0; <--------- ここの字下げをチェック?

上記ご認識で合っています。

gccの警告オプション"misleading-indentation"によって出力されている警告です。

そのため、インデント修正により警告を回避可能です。

> awl13_ioctl.c
> 1024byte確保されている変数に対してそれを超える内容が代入されていることでチェックされているように見受けられます。

これは、スタックサイズが1024Bytesを越えたことによる警告です。スタック
オーバーフローが発生する可能性を低減するため、スタックサイズは極力少な
くした方が好ましい為に設定されています。

gccの警告オプション"frame-larger-than=1024"によって出力されている警告
です。"1024"は、カーネルコンフィギュレーション"FRAME_WARN"によって指定
されています。

警告の回避方法としてはいくつか考えられ、
1. action_reqをbss(グローバル変数)等、スタック以外に置く
2. action_reqをdynamicにallocateするようにする
3. action_reqのサイズを減らす
4. FRAME_WARNの値を変更する
等が挙げられます。

どの方法が適切か検討し、次回ソフトウェアアップデートに含めたいと思います。

miyamoto

2018年11月14日 15時11分

溝渕様

お世話になります。宮本です。
早急なご確認ありがとうございます。

詳細にご説明頂き勉強になりました。
次回アップデートで対応いただけるとのことで承知しました。
よろしくお願いいたします。