コグノスケ


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

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

2018年3月25日

アイス

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

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

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

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

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

編集者:すずき(2018/04/11 01:11)

コメント一覧

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



2018年3月24日

Ubuntu 14.04のccacheの謎

目次: GCC

昨日(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をアンインストール

辺りが考えられます。

編集者:すずき(2025/06/09 00:07)

コメント一覧

  • すずきさん(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 この記事にコメントする



2018年3月23日

Ubuntu 14.04とccacheとGCC 7

目次: GCC

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

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のとある警告オプションを使うとハマります。

編集者:すずき(2025/06/09 00:07)

コメント一覧

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



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

管理用メニュー

link 記事を新規作成

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

最近のコメント5件

  • link 25年10月6日
    すずきさん (10/10 13:14)
    「ですね。ccはもはやコンパイラというより...」
  • link 25年10月6日
    hdkさん (10/10 08:27)
    「ただのHello, worldでも試して...」
  • link 25年9月29日
    すずきさん (10/03 00:29)
    「なんと、メタパッケージ入れてなかったです...」
  • link 25年9月29日
    hdkさん (10/02 06:51)
    「あれ、dkmsは自動ビルドされるのが便利...」
  • link 20年8月24日
    すずきさん (08/30 22:06)
    「ですね、自分も今はPulseAudioを...」

最近の記事20件

  • link 23年4月10日
    すずき (10/10 01:20)
    「[Linux - まとめリンク] 目次: Linuxカーネル、ドライバ関連。Linux kernel 2.4 for ARMが...」
  • link 25年10月6日
    すずき (10/10 01:19)
    「[makeのデフォルトルールのリンクはLDを使わない] 目次: LinuxMakefileの達人には常識かもしれませんが、ma...」
  • link 09年11月3日
    すずき (10/09 23:58)
    「[Automakeの出力を簡潔化する方法がわからない] 目次: Linux最近はMakefileを自作せずに、GNU Tool...」
  • link 18年7月2日
    すずき (10/09 23:56)
    「[libtoolが見つからないときの謎エラー] 目次: LinuxRaspberry Pi 3を持っているのですが、あまり速く...」
  • link 15年12月27日
    すずき (10/09 23:55)
    「[GNU autotools入門 その2] 目次: LinuxGNU autotoolsは簡単なんですが、使い始めるまではかな...」
  • link 15年12月26日
    すずき (10/09 23:55)
    「[GNU autotools入門 その1] 目次: Linuxソースコードのビルドシステムは多々あって決定打はない(個人的には...」
  • link 19年9月17日
    すずき (10/09 23:54)
    「[makeは環境変数とmake変数の挙動が違う] 目次: Linuxシェルからmakeに渡す環境変数とmake変数の関係を知ら...」
  • link 09年4月8日
    すずき (10/09 23:53)
    「[同じ環境のPC2台なのにsedのビルド成功/失敗が変わる?] 目次: Linuxサーバでプログラムをmakeすると、挙動が違...」
  • link 15年12月28日
    すずき (10/09 23:50)
    「[GNU autotools入門 その3] 目次: LinuxGNU autotoolsの話を書いていて思い出したのですが、a...」
  • link 19年10月14日
    すずき (10/09 23:50)
    「[linux-nextでdirtyがバージョン情報に付く仕組み] 目次: LinuxLinuxというかlinux-nextです...」
  • link 15年6月3日
    すずき (10/09 23:49)
    「[ビルド高速化ツールccache] 目次: Linux巨大なプロジェクト(Androidなど)をコンパイルするときに欠かせない...」
  • link 15年6月5日
    すずき (10/09 23:49)
    「[バージョン管理システムとmakeの相性] 目次: Linux前々から感じていたのですが、この2者は非常に相性が悪いと思います...」
  • link 25年10月4日
    すずき (10/06 02:52)
    「[Linuxのprocファイルシステムの実装 - /proc/pid/ioのopenとread] 目次: Linux以前、Li...」
  • link 25年2月19日
    すずき (10/05 22:30)
    「[LinuxのI/O統計情報が読めないプロセスの謎を追う] 目次: Linux前回はsystemd --userの/proc/...」
  • link 25年10月1日
    すずき (10/05 15:24)
    「[V4L2でUSBカメラのキャプチャをする方法] 目次: LinuxV4L2(Video for Linux 2)は多才で全て...」
  • link 24年12月6日
    すずき (10/05 14:53)
    「[ffmpegでYUVのrawvideo画像を生成、表示する方法] 目次: LinuxFFMPEG(ffmpeg)を使ってYU...」
  • link 23年6月1日
    すずき (10/05 13:59)
    「[自宅サーバー - まとめリンク] 目次: 自宅サーバーこの日記システム、Wikiの話。カウンターをPerlからPHPに移植日...」
  • link 25年10月3日
    すずき (10/05 01:34)
    「[udevでデバイスの属性を調べる方法] 目次: Linuxいつも忘れるudevの使い方メモです。udevadmでデバイス属性...」
  • link 25年9月27日
    すずき (10/03 09:11)
    「[KernelSharkのLatency列の5桁目] 目次: Linux前回(2025年9月20日の日記参照)はKernelS...」
  • link 25年9月20日
    すずき (10/02 02:34)
    「[KernelSharkのLatency列] 目次: LinuxKernelSharkのイベント情報を見ると「Latency」...」
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 2025年
open/close 過去日記について

その他の情報

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

合計:  counter total
本日:  counter today

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

最終更新: 10/10 13:14