link もっと前
   2018年 3月 24日 -
      2018年 4月 2日  
link もっと後

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

日々

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

アイス

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

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

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

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

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

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

コメント一覧

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



link もっと前
   2018年 3月 24日 -
      2018年 4月 2日  
link もっと後

管理用メニュー

link 記事を新規作成

合計:  counter total
本日:  counter today

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

最終更新: 5/22 22:26

カレンダー

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

最近のコメント 5件

  • link 18年05月20日
    すずき 「数えたことはありませんが Windows...」
    (更新:05/22 22:26)
  • link 18年05月20日
    hdk 「Linux も、先日の Meltdown...」
    (更新:05/21 22:55)
  • link 15年12月27日
    すずき 「お役に立てて何よりです。」
    (更新:05/12 21:45)
  • link 15年12月27日
    名前 「助かりました。勉強になります。」
    (更新:05/11 12:40)
  • link 13年09月13日
    すずき 「コメントありがとうございます、お役に立て...」
    (更新:05/10 09:32)

最近の記事 3件

link もっとみる
  • link 18年05月10日
    すずき 「[ポケモン GO] エラーが出て起動しなくなってしまいました。しつ...」
    (更新:05/21 02:09)
  • link 18年05月13日
    すずき 「[自動車税] 今年も自動車税の支払い時期が来ました。税額は 45,...」
    (更新:05/21 02:03)
  • link 18年05月20日
    すずき 「[最初の設計が肝心] 初期段階の設計失敗を、最終段階の設定や運用で...」
    (更新:05/21 01:41)

こんてんつ

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 サイトの情報