link もっと前
   2018年 3月 30日 -
      2018年 3月 21日  
link もっと後

link 未来から過去へ表示(*)
link 過去から未来へ表示

日々

link permalink

アイス

アイスの写真を 10個くらい追加して、77種類になりました。これでもまだ載せていないアイスがたくさんあるんだ…。

集計してみると、こんな感じ。

  • 赤城乳業: 25
  • ファミマ: 6
  • グリコ : 4
  • 明治 : 5
  • 森永乳業: 12
  • ロッテ : 9
  • その他 : 16

赤城乳業のファンであることは否定しませんが、新商品を見かけたらとりあえず買うので、特に選り好みはしていません。

それでも赤城乳業がやたら多いのは、ガリガリ君の新商品の出る感覚がかなり短いからでしょうね……。

[編集者: すずき]
[更新: 2018年 4月 11日 01:11]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link permalink

Ubuntu 14.04 の ccache の謎

昨日(2018年3月23日の日記参照)で GCC 7 と 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;
}

なぜそうなるのか、ざっと見てみました。使うのは下記のスクリプトです。引数をファイル /tmp/aaa.txt に「追記」でダンプした後、本物の GCC を起動するスクリプトです。

引数のダンプを標準出力に出さない理由は、標準出力が ccache に取られて見えないから、「追記」モードで出力する理由は ccache が gcc を 2回起動するからです。sleep 10 を入れた理由は、引数に一時ファイルを指定されたとき消える前に見たいからです。

gcc と置き換えるスクリプト

#!/bin/sh

echo $* >> /tmp/aaa.txt
sleep 10

gcc_ $*

使い方は /usr/bin/gcc を /usr/bin/gcc_ にリネームし、このスクリプトを /usr/bin/gcc として配置するだけです。ではやってみましょうか。

ccache 3.4.1 を実行したときのファイルの内容(OK)
-Wimplicit-fallthrough=3 -E a.c
-Wimplicit-fallthrough=3 -c -o a.o a.c

最初に GCC をプリプロセッサのみ(-E)で起動し、次に GCC を元の引数(-c -o a.o a.c)で起動しています。

ccache 3.1.9 を実行したときのファイルの内容(NG)
-Wimplicit-fallthrough=3 -c -E a.c
-Wimplicit-fallthrough=3 -c -o /home/katsuhiro/.ccache/d/a/8431625291455df2df790a4c34be0d-395.o.tmp.blackbird.18397 /home/katsuhiro/.ccache/tmp/a.tmp.blackbird.18397.i

プリプロセッサのみで起動するところは同じですが、その後が違っていて、一時ファイルをコンパイルするように指定しています。このファイルが怪しいですね。

ccache 3.1.9 が GCC に渡す一時ファイルの内容

# 1 "a.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 31 "<command-line>"
# 1 "/usr/include/stdc-predef.h" 1 3 4
# 32 "<command-line>" 2
# 1 "a.c"
int a(int i)
{
 switch (i) {
 case 0:
  i = 2;

 case 1:
  i = 3;
  break;
 default:
  return 0;
 }

 return 0;
}

見たところプリプロセッサ出力をそのまま保存しているようです。case 1: の前にあったコメント /* Fall through */ が消えていますので、-Wimplicit-fallthrough=3 でも警告が出てしまいます。

GCC 6 までは、元のコードと、プリプロセッサ出力(コメントが全て消える)の間で、警告内容に差は無かったのだろうと思われますが、-Wimplicit-fallthrough は「コメントの内容」によって動作が変わるオプションのため、誤動作を引き起こしたようです。

対策

Ubuntu 14.04 に GCC 7 は採用されていませんが、クロスコンパイラなどで GCC 7 とご対面する可能性があります(自分がそうでした)。

対策としては、

  • Ubuntu 14 から Ubuntu 17 系に移行(3/28 Ubuntu 16 → 17 に訂正、Ubuntu 16 でも ccache が古いのでダメ)
  • Ubuntu 14 じゃなきゃダメな人は ccache だけ新しいバージョンに強制上書き
  • コンパイル速度の低下を許せるなら GCC 7 のときだけ ccache を無効化
  • 考えるのが面倒なら ccache をアンインストール

辺りが考えられます。

[編集者: すずき]
[更新: 2018年 3月 28日 18:38]
link 編集する

コメント一覧

  • すずき 
    記事は後で訂正しますが、Ubuntu のアップデートで対応しようとするなら、Ubuntu 17.10 に移行する必要があります。

    Ubuntu 14.04 LTS の ccache 3.1.9: NG
    Ubuntu 16.04 LTS の ccache 3.2.4: NG
    Ubuntu 17.10 の ccache 3.3.4: OK 
    (2018年03月26日 14:39:40)
open/close この記事にコメントする



link permalink

Ubuntu 14.04 と ccache と GCC 7

会社で超ハマったのでメモしておきます。

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 と暗黙のフォールスルーの警告
$ ./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 と暗黙のフォールスルーの警告
$ 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 だから無関係?

Ubuntu 14.04 の GCC は 4.8 なので、無関係かと思うかもしれませんが、外部から持ってきたクロスコンパイル用のツールチェーンでも同じことが起きます。x86 用だろうが ARM 用だろうが、GCC 7 のとある警告オプションを使うとハマります。

[編集者: すずき]
[更新: 2018年 3月 24日 14:06]
link 編集する

コメント一覧

  • コメントはありません。
open/close この記事にコメントする



link もっと前
   2018年 3月 30日 -
      2018年 3月 21日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDF ファイル RSS 1.0
QR コード QR コード

最終更新: 9/20 11:22

カレンダー

<2018>
<<<03>>>
----123
45678910
11121314151617
18192021222324
25262728293031

最近のコメント 5件

  • link 18年09月07日
    すずき 「ありがとう!\nこちらこそ、楽しみにして...」
    (更新:09/11 19:30)
  • link 18年09月07日
    よしだあ 「おつかれさまでした!\nまた仕事できるの...」
    (更新:09/11 19:17)
  • link 18年08月15日
    すずき 「うーん、なんか暴走したり、動かなかったり...」
    (更新:08/15 10:52)
  • link 18年08月15日
    すずき 「実行できた。あと実行ファイルパスについて...」
    (更新:08/15 10:42)
  • link 18年08月15日
    すずき 「さすがに x86_64 と arm のク...」
    (更新:08/15 10:35)

最近の記事 3件

link もっとみる
  • link 18年09月15日
    すずき 「[TigerVNC のエラーメッセージ] TigerVNC Jav...」
    (更新:09/20 11:22)
  • link 18年09月16日
    すずき 「[音が出なくなったよ Windows 10] 昨日まで元気に動作し...」
    (更新:09/20 11:10)
  • link 18年09月13日
    すずき 「[府民から都民へ] 家が決まりました。今月末から東京都民です。さよ...」
    (更新:09/17 20:03)

こんてんつ

open/close wiki
open/close Java API

過去の日記

open/close 2002年
open/close 2003年
open/close 2004年
open/close 2005年
open/close 2006年
open/close 2007年
open/close 2008年
open/close 2009年
open/close 2010年
open/close 2011年
open/close 2012年
open/close 2013年
open/close 2014年
open/close 2015年
open/close 2016年
open/close 2017年
open/close 2018年
open/close 過去日記について

その他の情報

open/close アクセス統計
open/close サーバ一覧
open/close サイトの情報