USB Wi-Fi カードの C ドライバー コードを読んでいて、完全に理解できない部分に遭遇しました。C 言語と演算子の優先順位についての私の理解が間違っていて、ドライバー コードに問題がないのではないかと思いますが、確認したいと思いました。
一連の値を 14 要素の配列に/drivers/net/wireless/rtl818x/rtl8187/dev.c
読み込むコードがあります。channels
関連するコードdev.c
は次のとおりです。
channel = priv->channels;
for (i = 0; i < 3; i++) {
eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_1 + i,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
for (i = 0; i < 2; i++) {
eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_4 + i,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
....
if (!priv->is_rtl8187b) {
for (i = 0; i < 2; i++) {
eeprom_93cx6_read(&eeprom,
RTL8187_EEPROM_TXPWR_CHAN_6 + i,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
} else {
eeprom_93cx6_read(&eeprom, RTL8187_EEPROM_TXPWR_CHAN_6,
&txpwr);
(*channel++).hw_value = txpwr & 0xFF;
eeprom_93cx6_read(&eeprom, 0x0A, &txpwr);
(*channel++).hw_value = txpwr & 0xFF;
eeprom_93cx6_read(&eeprom, 0x1C, &txpwr);
(*channel++).hw_value = txpwr & 0xFF;
(*channel++).hw_value = txpwr >> 8;
}
このコードに関する私の懸念は、への最初の呼び出しが逆参照する前(*channel++).hw_value = ...
に channel ポインターをインクリメントし、それによってchannels の要素から開始し、 element が欠落していると考えていたことです。また、どの if/else ブランチが実行されるかに関係なく、 への 14 回の呼び出しを数えるので、 への最後の呼び出しは実際には (存在しない) を指し、たまたま後に続く変数のメモリを上書きすると考えていたでしょう。スタック。私の解釈のどこが間違っていたのか、誰か指摘できますか?[1]
[0]
(*channel++)...
(*channel++)
channel[15]
channels