会社で超ハマったのでメモしておきます。
GCC 7からswitch-case文において、暗黙のフォールスルーを警告する機能 -Wimplicit-fallthroughが実装されました。動作の仕様についてはRedHatの解説(リンク)が詳しいです。
フォールスルーの警告オプションは -Wimplicit-fallthrough=3のように指定しますが、オプションを直接指定するより-Wextraの指定により勝手にONにされている、というパターンが多いのではないでしょうか。ちなみに -WallではONになりません。
Ubuntu 14.04のccache 3.1.9とこのフォールスルー警告オプションを組み合わせると変な挙動を示します。まずはこんなプログラムを用意します。
int a(int i)
{
switch (i) {
case 0:
i = 2;
/* Fall through */
case 1:
i = 3;
break;
default:
return 0;
}
return 0;
}
このプログラムは、フォールスルーの警告オプションのレベルを4以上にすると、警告が発生します。ちなみにデフォルトの警告レベルは3ですから、レベルを指定しない場合や、-Wextraなどでは警告は発生しません。
$ gcc --version gcc (Debian 7.3.0-11) 7.3.0 Copyright (C) 2017 Free Software Foundation, Inc. This is free software; see the source for copying conditions. There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. $ gcc -Wextra a.c -c -o a.o ★警告無し★ $ gcc -Wimplicit-fallthrough a.c -c -o a.o ★警告無し★ $ gcc -Wimplicit-fallthrough=3 a.c -c -o a.o ★警告無し★ $ gcc -Wimplicit-fallthrough=4 a.c -c -o a.o a.c: In function ‘a’: a.c:5:5: warning: this statement may fall through [-Wimplicit-fallthrough=] i = 2; ~~^~~ a.c:7:2: note: here case 1: ^~~~
しかしUbuntu 14.04の古いccacheを経由してGCCを起動すると、おかしなことが起きます。警告されないはずのレベルを指定しても警告が出てしまうのです……。
$ ./ccache --version ccache version 3.1.9 Copyright (C) 2002-2007 Andrew Tridgell Copyright (C) 2009-2011 Joel Rosdahl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. $ gcc -Wimplicit-fallthrough=3 a.c -c -o a.o ★警告無し★ $ ./ccache gcc -Wimplicit-fallthrough=3 a.c -c -o a.o a.c: In function ‘a’: a.c:5:5: warning: this statement may fall through [-Wimplicit-fallthrough=] i = 2; ~~^~~ a.c:7:2: note: here case 1: ^~~~ ★なぜか警告が出る★
とても不思議ですが、新しいccacheだとこの現象は発生しません。
$ ccache --version ccache version 3.4.1 Copyright (C) 2002-2007 Andrew Tridgell Copyright (C) 2009-2018 Joel Rosdahl This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 3 of the License, or (at your option) any later version. $ ccache gcc -Wimplicit-fallthrough=3 a.c -c -o a.o ★警告無し★
推測の域を出ませんがccacheのバグなんだろうなあとは思います。
Ubuntu 14.04のGCCは4.8なので、無関係かと思うかもしれませんが、外部から持ってきたクロスコンパイル用のツールチェーンでも同じことが起きます。x86用だろうがARM用だろうが、GCC 7のとある警告オプションを使うとハマります。
名古屋旅行の一つの目的である、リアル脱出ゲーム(進撃の巨人とのコラボ作品)に参加しました。少なくとも5回は参加していると思いますが、初めてクリアできました。やった。名古屋まで来た甲斐がありました。
一緒に参加した仲間に恵まれました皆さん経験者なのはもちろんのこと、問題解決のスピードも質も最高でした。
初クリアにして、パーフェクト(※)に解けました。充実感が凄い。
(※)問題が解けないけど、当てずっぽうで答えを推測などせず、全ての答えを導いてクリアしたという意味で使っています。
クリアしたチームは23チーム中4チームでした。
クリアして初めて分かったのですが、今まで参加したリアル脱出ゲームは、到底クリアできないペースだったことが良くわかりました……。脱出成功のときの、問題を解くペースは凄まじく早いです。
今回は6人チームで、チェックポイントごとに6問同時に問題が出るタイプでしたが、1人1問ずつ問題を即答しないと時間が足りません。
悩んで止まるとほぼクリアは無理です。
制限時間60分で、最終問題の答えを出した段階で、残り時間は10分くらいでした。
もしや一番最初にクリアできたか?と思ったのですが、一番ではありませんでした。上には上がいますねー。
メモ: 技術系の話はFacebookから転記しておくことにした。
奥さんと2人で名古屋に旅行に来ています。
名古屋プリンスホテルの部屋にあるテレビがSONYのAndroid TV KJ-43X8000Eでした。
ざっと見た感じでは、設定やGoogleストアアプリを消し、客が勝手にいじれないよう制限を掛けたAndroid TV という感じです。
リモコンは市販品を流用しているらしくGoogle PlayやNETFLIXのボタンが存在しますが、これらのボタンを押しても「その機能は使えない」と表示されるだけで、何も起きません。
プリンスホテルの案内用ページは不思議な作りでした。なぜか構内放送に載せたBML(データ放送)で実現されています。
クソ重い(※)し、解像度メチャクチャ低いし、何でこんな実装にしたのか、気になりますね……。
個人的な予想としては、ホテルの他の部屋にはAndroid TVではないor他メーカーのテレビが置かれており、全てのテレビで共通で使える表示機能がBMLしかなかったのかもしれません。
(※)SONYやSHARPのAndroid TVは、テレビを見ている間Androidの動作が非常に遅くなります。なぜなんだ……??
プリンスホテルのように、ユーザーが頑張ってテレビで何かを動かそうとしたとき、各社テレビ共通で使える機能といえば、
この二択しかなさそうです。
テレビをプラットフォーム(ユーザーがアプリケーションなどを動かす環境)として見ると、下の下ですね。
テレビもスマホも使っているハードウェアは大差ないですから、テレビとスマホの自由度の差は、ほぼソフトウェアの差でしょうね。テレビもスマホのようにAndroidかiOSに支配されれば幸せなんですかね……?
< | 2018 | > | ||||
<< | < | 03 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | - | - | - | 1 | 2 | 3 |
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
合計:
本日: