5月11日、Eta Labsが「Comparison of C/POSIX standard library implementations forLinux」と題した記事を公開した。この記事では、LinuxにおけるC/POSIX標準ライブラリの実装の比較について詳しく紹介されている。以下に、その内容を紹介する。このプロジェクトは、Linux上で利用可能なさまざまな標準ライブラリの実装を比較したもので、特に機能の充実度と無駄のバランスに焦点を当てている。著者はmuslの開発者であり、記事の中で各ライブラリの特徴を比較している。今後、この比較には詳細なパフォーマンスベンチマークと、GoogleのBionicや他のBSD libcポートなど、さらなるライブラリの実装が追加される予定である。ライブラリの膨張比較以下の表では、musl、uClibc、dietlibc、glibcの4つのライブラリ

Old New Thing: 未定義動作はタイムトラベルを引き起こす(他にもいろいろあるけど、タイムトラベルが一番ぶっ飛んでる) Undefined behavior can result in time travel (among other things, but time travel is the funkiest) - The Old New Thing - Site Home - MSDNBlogs 久しぶりに紹介するRaymond Chenのブログ記事。 C言語とC++では、様々な部分が、ドラゴンの住まう地というレッテルを貼られている。いや、正式には、未定義動作とされている。 未定義動作が発動した場合、何でもありだ。例えば、変数は同時にtrueでもfalseでもありえる。John Regehrは興味深い例のリストをまとめて、未定義動作コンテストの受賞者もある。 以下の関数を
C++で副作用のない無限ループを書くと未定義動作になります。 「未定義動作」というのは口に出すだけでC++プログラマーを震え上がらせる力を持った言葉です。「鼻から悪魔が出てくる」という言葉で説明されるように、未定義動作を含むコードを実行した結果は何も保証することができず、バグの発見やデバッグすら困難にさせます。未定義動作下においてはコンパイラの気分によってコード片が消え、trueとfalseが同時に成立し、タイムトラベルを引き起こします1。 そのためC++ではうっかり未定義動作が埋め込まれないよう注意が払われるのが普通です。 さて、以下のC++のコードは未定義動作を引き起こします。 下の例は実際にclang/LLVMで最適化を有効にしてコンパイルするとでたらめな値を返す関数ができました。 この話をしたところ、何人かに驚かれたり異論を受け取ったりしたので、この話題について少しまとめてみました

Cosmopolitan Libc is well-known forits polyglot fat binary hack that lets your executables run on six OSes forAMD64 / ARM64. What may surprise you is thatit could also be the best C library for your production workloads too. To demonstrate this point, let's compare Cosmo's mutex library with other platforms. We'll do this by writing asimple test that spawns 30 threads which increment the same

what rr does rr aspires to be your primary C/C++ debugging tool forLinux, replacing — well, enhancing — gdb. You record a failure once, then debug the recording, deterministically, as many times as you want. The same execution is replayed every time. rr also provides efficient reverse execution under gdb. Setbreakpoints and data watchpoints and quickly reverse-execute to where they were hit. rr
C言語の符号付き整数の足し算、引き算、掛け算は「2^nを法とするモジュラー演算である」と説明されることがありますが、これは間違いです。正しい説明は、「C言語の符号付き整数のオーバーフローは未定義動作である」となります。 この違いが観測できる例を2つ紹介します。 まず、単項マイナスについて。以下のプログラムを考えます: #include <limits.h> #include <stdbool.h> #include <stdio.h> bool f(int x) { return x == -x; } int main() { printf("%s\n", f(INT_MIN) ? "true" : "false"); } int 型の単項マイナスが2^nを法とするモジュラー計算で行われるのであれば、f が true を返す x は 0 と INT_MIN の2つのはずです。ですが、実際に

C/C++でプログラムを書いているときに遭遇する厄介なバグの一つがメモリリークです。 今回はメモリリークを検出するのに使えるツールの使い方について書きます。 AddressSanitizer コンパイルオプションをつけるだけで使えて出力も見やすいのでおすすめです。 AddressSanitizerはGCC 4.8以降かLLVM 3.1以降で使うことができます。 コンパイル時にオプションをつけるだけでメモリリークを検出してくれます。(若干実行時間が長くなります) 以下のメモリリークのあるプログラム leak.cpp を例に使い方を説明します。 int main() { int *a = new int[10]; } newで作った動的配列をdeleteしていないのでメモリリークになります。 g++ -fsanitize=address -fno-omit-frame-pointer -g l

[Edit: Welcome Hacker News readers! Before we dive into the neat memory management esoterica, I want to brieflynote that as engineers we have an ethical obligation in our work to consider the "safety, health, and welfare of the public", because if we don't, terrible things happen. This is a challenging responsibility that requires we all stay thoughtful and informed – but that's difficult if popu
先に概要を書くと caseの値は連番かつ昇順(上から小さい数で下に行くほど増えていく)となるように心がける。ある程度caseが多ければあとは勝手にコンパイラがテーブルジャンプ最適化を行う。goto文やreturn文などでswitch文途中から抜けないようにする。あるとテーブルジャンプ最適化が行われない。 MSVC(Visual Studio)でコンパイルする場合、default:の箇所に__assume(0);と記述すれば上記二つを無視して強制的にテーブルジャンプ最適化が行われる。ただし、goto・return等でのswitch抜けがあるまま実行すると例外エラーが発生する。 追記:上記の__assume(0)はC++23から「std::unreachable()」で標準化 FM TOWNSエミュレータ「津軽」を弄っていて、どうもエミュレーターの実行速度が既にあるTOWNSエミュレータの「

既存のプロジェクトで使用しているコンパイラを置き換えるだけで、Zigに付属しているCコンパイラを利用できる。 クロスビルドが標準で可能 上でも述べた通り、Zigは標準でクロスコンパイルが可能である。Zig libcのTaget一覧 ❯zig targets | jq ".libc" [ "aarch64_be-linux-gnu", "aarch64_be-linux-musl", "aarch64_be-windows-gnu", "aarch64-linux-gnu", "aarch64-linux-musl", "aarch64-windows-gnu", "aarch64-macos-none", "aarch64-macos-none", "armeb-linux-gnueabi", "armeb-linux-gnueabihf", "armeb-linux-musleabi

24 aug 2020 @justine's web page αcτµαlly pδrταblε εxεcµταblε One day, while studying old code, I found out thatit's possible to encodeWindows Portable Executable files as a UNIX Sixth Edition shell script, due to the fact that the Thompson Shell didn't use a shebangline. Once I realizedit's possible tocreate a synthesis of the binary formats being used by Unix,Windows, andMacOS, I couldn't
This is Words and Buttons Online — a collection of interactive #tutorials, #demos, and #quizzes about #mathematics, #algorithms and #programming. So you think you know C? A lot of programmers claim they know C. Well,it has the most famous syntax,it has been there for 44 years, andit’s not cluttered withobscure features.It’s easy! I mean,it’s easy to claim that you know C. You probably learne
(注:2017/04/27、いただいたフィードバックを元に翻訳を修正いたしました。) この記事では、皆さん(特にC言語のプログラマ)に「自分はCを分かっていなかった」と気付いてもらうことを目標にしています。 Cの落とし穴は、思っているよりもずっと身近なところにあります。ちょっとしたコードにも 未定義の動作 が潜んでいることを以下で示しましょう。 この記事はQ&A形式になっており、それぞれの例題は独立したソースコードとして扱ってください。 1. Q: これは正しいコードでしょうか? (変数の二重定義エラーが発生するでしょうか。上述の通り、これは独立したソースファイルであり、関数本体や複合ステートメントの一部ではありません) 解答 A: 正しいコードです。1行目は仮定義であり、2行目でコンパイラが処理した後に “定義” になります。 2. extern void bar(void); void

Deleted articles cannot be recovered. Draft of this article would be also deleted. Are you sure you want to delete this article? 漢は黙ってシングルファイル C/C++ ライブラリですね! シングルファイル C/C++ ライブラリとは, ヘッダファイル .h ひとつだけで機能が実装されているライブラリ(もう少し条件をゆるくして .cc も含む)のことです. header-only とも言われれたりします. このあたりの元祖は nothings 先生 http://nothings.org/ ですね. 最近はgithub にコードをあげています. シングルファイル系のライブラリまとめ一覧もあります. シングルファイル系が便利すぎてやばいので, 自分でもいくつか作り

一番右端の立っているビット位置(RightMostBit)を求めるコードで速いのないかなーと探していたら、ものっっっすごいコードに出会ってしまったのでご紹介。2ch のビット演算スレで 32bit 値のコードに出会って衝撃を受けて、その後 64bit 値版のヒントを見つけたのでコードを書いてみました。 この問題はハッカーのたのしみ―本物のプログラマはいかにして問題を解くか (Google book search で原著 Hacker's delight が読めたのでそれで済ませた) で number of trailing zeros (ntz) として紹介されています。bit で考えたときに右側に 0 がいくつあるかを数えるもの。1 だと 0、2 だと 1、0x80 なら 7、12 なら 2 といったぐあい。0 のときに表題どおりの問題として考えるといくつを返すの?ってことになるので、
By Sean Eron Anderson seander@cs.stanford.edu Individually, the code snippets here are in the publicdomain (unless otherwisenoted) — feel free to use them however you please. The aggregate collection and descriptions are © 1997-2005 Sean Eron Anderson. The code and descriptions are distributed in the hope that they will be useful, but WITHOUT ANY WARRANTY and without even the implied warranty of
http://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/h/curry を Sun から x86 に。 C言語は便利で楽しいなあ、と思わざる得ないのである。 に激しく同意なのです。 #include <stdio.h> #include <stdlib.h> #include <sys/mman.h> int (*curry(int (*F)(), int A))() { char *code = (char*)malloc(18); *(char*)code = 0x55; *(short int*)(code+1) = 0xe589; *(short int*)(code+3) = 0x75ff; *(char*)(code+5) = 0x08; *(char*)(code+6) = 0x6a; *(char*)(code+7) = (ch
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く