コグノスケ


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

link もっと前
2018年3月24日 >>> 2018年3月24日
link もっと後

2018年3月24日

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/03/28 18:38)

コメント一覧

  • すずきさん(2018/03/26 14:39)
    記事は後で訂正しますが、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
open/close この記事にコメントする



link もっと前
2018年3月24日 >>> 2018年3月24日
link もっと後

管理用メニュー

link 記事を新規作成

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

最近のコメント20件

  • link 20年6月19日
    すずきさん (04/06 22:54)
    「ディレクトリを予め作成しておけば良いです...」
  • link 20年6月19日
    斎藤さん (04/06 16:25)
    「「Preferencesというメニューか...」
  • link 21年3月13日
    すずきさん (03/05 15:13)
    「あー、このプログラムがまずいんですね。ご...」
  • link 21年3月13日
    emkさん (03/05 12:44)
    「キャストでvolatileを外してアクセ...」
  • link 24年1月24日
    すずきさん (02/19 18:37)
    「簡単にできる方法はPowerShellの...」
  • link 24年1月24日
    KKKさん (02/19 02:30)
    「追伸です。\nネットで調べたらマイクロソ...」
  • link 24年1月24日
    KKKさん (02/19 02:25)
    「私もエラーで困ってます\n手動での回復パ...」
  • link 24年1月24日
    すずきさん (02/13 11:48)
    「ありがとうございます。\n私のPCはもう...」
  • link 24年1月24日
    えはらさん (02/12 15:00)
    「Powershellのスクリプトは以下の...」
  • link 24年2月2日
    すずきさん (02/02 18:17)
    「サーバー側の設定はとても簡単でした。ちょ...」
  • link 24年2月2日
    hdkさん (02/02 08:54)
    「さくらのレンタルサーバの設定でLet's...」
  • link 24年1月24日
    すずきさん (01/28 11:35)
    「ご指摘ありがとうございます。確かに間違っ...」
  • link 24年1月24日
    通りすがりさん (01/27 14:05)
    「Powershellで解決しなかったのは...」
  • link 23年11月29日
    すずきさん (12/04 00:38)
    「あ、そうか。1nsですね。ありがとうござ...」
  • link 23年11月29日
    hdkさん (12/03 18:49)
    「>(本来1usなのに1msになって...」
  • link 23年11月29日
    すずきさん (12/03 00:35)
    「大山先生、お久しぶりです。コメントありが...」
  • link 23年11月29日
    大山恵弘さん (12/02 18:53)
    「すずきさんのX(旧Twitter)へのポ...」
  • link 20年7月12日
    すずきさん (10/19 11:17)
    「ご指摘ありがとうございます。9月の編集は...」
  • link 20年7月12日
    通り縋りさん (10/18 19:08)
    「上の記事2023年9月編集という事ですが...」
  • link 23年9月22日
    すずきさん (09/23 21:14)
    「そうなんですよ。賢いなーと思って自分でも...」

最近の記事3件

  • link 24年4月17日
    すずき (04/18 22:44)
    「[VSCodeとMarkdownとPlantUMLのローカルサーバー] 目次: LinuxVSCodeのPlantUML Ex...」
  • link 23年4月10日
    すずき (04/18 22:30)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linuxのstruct pageって何?Linu...」
  • link 20年2月22日
    すずき (04/17 02:22)
    「[Zephyr - まとめリンク] 目次: Zephyr導入、ブート周りHello! Zephyr OS!!Hello! Ze...」
link もっとみる

こんてんつ

open/close wiki
open/close Linux JM
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 2019年
open/close 2020年
open/close 2021年
open/close 2022年
open/close 2023年
open/close 2024年
open/close 過去日記について

その他の情報

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

合計:  counter total
本日:  counter today

link About www.katsuster.net
RDFファイル RSS 1.0

最終更新: 04/18 22:44