タグ

Cに関するmas-higaのブックマーク (43)

  • strlen() の深淵 - Qiita

    あらまし strlen() という関数がある。御存知の通り、文字列の長さを算出する標準 C ライブラリの関数だ。 やってることは単純で、例えば以下のように実装できる。 size_t strlen_simple(const char* str) { const char* p = str; while (*p) ++p; return size_t(p - str); } '\0' が見つかるまでポインタを進め、初期位置との差分を返すだけだ。これで機能的には std::strlen() と同等である。 では、速度的にはどうだろう?適当にベンチマークを書いて MSVC 2022 でコンパイル&実行するとこうなった。

    strlen() の深淵 - Qiita
    mas-higa
    mas-higa 2023/08/07
    "inline 展開されたときとされなかったときで全く別の実装が用いられることがあり" 昔聞いたことある気がする
  • 最新C++(C++23)からみた最新C(C23) - Qiita

    参考資料 次期C標準 (C23) の内容が固まったらしい cppreference.com - C23 🙇 Q. これはC++の記事というよりも、Cの記事ではないですか? A. 「お前がそう思うんならそうなんだろう お前ん中ではな」 C99言語機能では_Boolキーワードとして導入され、ヘッダstdbool.hによりbool型とtrue/false定数が有効となっていた。C23以降は常にbool/true/falseとして利用可能となる。 ↩ C99言語機能では_Static_assertキーワードとして導入され、ヘッダassert.hによりstatic_assertが有効となっていた。C23以降は常にstatic_assertとして利用可能となる。またC23からC++17同様に第2引数を省略可能となる。 ↩ C99言語機能では_Thread_localキーワードとして導入され、ヘッダt

    最新C++(C++23)からみた最新C(C23) - Qiita
    mas-higa
    mas-higa 2022/12/09
    "引数リストを明示しない関数宣言の廃止" まだそんなことできたんか!?
  • 米国家安全保障局、CやC++からメモリ安全なプログラミング言語への移行を推奨する文書を公開

    同ガイダンスは、近年のサイバーセキュリティ脅威の多くに利用されている、ソフトウェアのメモリ安全性の悪用を防ぐことを目的としており、組織におけるソフトウェアの開発にあたっては、可能な限りメモリ安全なプログラミング言語を使用するとともに、コンパイラのオプション、ツールのオプション、OS構成といったコードの安全性を高める対策を施すことで、保護を強化することを推奨している。 メモリ安全でないプログラミング言語としては、一般的に使用されているCやC++を挙げており、これらのプログラミング言語はメモリ管理において高い自由度と柔軟性を提供する一方で、メモリ参照が安全に行われているかどうかのチェックはプログラマに大きく依存していると指摘する。 ソフトウェア解析ツールを使用すれば、ソースコード中のメモリ管理における問題の多くを検出できるほか、OSによっては不正なメモリの利用を防ぐオプションも用意されているも

    米国家安全保障局、CやC++からメモリ安全なプログラミング言語への移行を推奨する文書を公開
    mas-higa
    mas-higa 2022/11/16
    C++ ってそんな危険か? / 過去に変なコーディング規約のせいで危険だった現場はあったな。
  • Rubyで構造体を扱う(ただし、Cの)。あとELFの話。 - ローファイ日記

    飛び入りです。Rubyアドベントカレンダーその2 17日目の記事です。昨日はなんとなく似たような(?)、 Rubyの8進数と2進数の構文エラー文の違い の話です。 qiita.com 今日はRubyで構造体、と言うか、バイナリパックされた構造体を扱う話の触りをします。class Structの話はしない。 さてみなさんは String#unpack/Array#pack を使ってますか? docs.ruby-lang.org すこく正直な話をすると、おそらく多くの方は使っていなくて、使っている方も大半はbase64文字列を生成する m フォーマットぐらいしか使っていないのではないかと推測しています。 ["Hello World"].pack('m') #=> "SGVsbG8gV29ybGQ=\n" ぼくも今まではそうだったのですが、最近は他のフォーマットも急に使うようになりました。という

    Rubyで構造体を扱う(ただし、Cの)。あとELFの話。 - ローファイ日記
    mas-higa
    mas-higa 2020/12/18
    "多分 char[65] のメンバが6つある" ??
  • Cの可変長引数とABIの奇妙な関係 - Qiita

    printf に関する以下のツイートが流行っていました。 上のツイートでは割とあっさり説明されていますが、amd64 SysV ABIでこの現象が起こる理由にはもっと深遠なものがあると思うので、可変長引数とからめて説明してみたいと思います。 前提条件として「ABI」「可変長引数」「non-prototyped関数」の知識が必要なのでそこから説明します ABIとは ABI (Application Binary Interface) とは、機械語レベルでのインターフェースのことです。 機械語そのもののルールはISA (Instruction Set Architecture) によって規定されていますが、たとえばC言語の「関数呼び出し」などの概念を機械語でどのように表現するかについては規定していません。そのルールを定めたのがABIです。したがって、ISAとABIはおよそ1対多の関係にあります

    Cの可変長引数とABIの奇妙な関係 - Qiita
  • pthread_once が嫌いすぎて再実装した話

    pthread_once が嫌いです。なぜ嫌いかって言うと、こんな感じで、ファイルレベルのグローバル変数やグローバル関数が出現し、また、値を使う場所と初期化コードの位置が離れがちで可読性が下がるから。 static volatile BIO_METHODS *biom = NULL; static void init_biom(void) { biom = BIO_meth_new(BIO_TYPE_FD, "h2o_socket"); BIO_meth_set_write(biom, write_bio); BIO_meth_set_read(biom, read_bio); BIO_meth_set_puts(biom, puts_bio); BIO_meth_set_ctrl(biom, ctrl_bio); } static void setup_connection(...) {

    mas-higa
    mas-higa 2019/07/23
    マクロは本当に強力
  • 低レイヤを知りたい人のための Cコンパイラ作成入門

    はじめに このオンラインブックは執筆中です。完成版ではありません。フィードバックフォーム このには一冊のに盛り込むにはやや欲張りな内容を詰め込みました。書では、C言語で書かれたソースコードをアセンブリ言語に変換するプログラム、つまりCコンパイラを作成します。コンパイラそのものもCを使って開発します。当面の目標はセルフホスト、すなわち自作コンパイラでそれ自身のソースコードをコンパイルできるようにすることです。 このでは、コンパイラの説明の難易度が急に上がりすぎないように、様々なトピックを書全体を通じて次第に掘り下げていくという形で説明することにしました。その理由は次のとおりです。 コンパイラは、構文解析、中間パス、コード生成といった複数のステージに概念的に分割することができます。よくある教科書的アプローチでは、それぞれのトピックについて章を立てて解説を行うことになりますが、そのよう

    mas-higa
    mas-higa 2018/11/02
    すごく丁寧に書かれてるのに Github のとこすごくあっさりしてた。
  • すごいC言語のマクロ __is_constexpr - Qiita

    #define __is_constexpr(x) \ (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8))) #include<stdio.h> #define Def 10 #define __is_constexpr(x) \ (sizeof(int) == sizeof(*(8 ? ((void *)((long)(x) * 0l)) : (int *)8))) enum test{Enum}; int main(){ int Val = 10; const int Const_val = 10; int a = __is_constexpr(Val); int b = __is_constexpr(Const_val); int c = __is_constexpr(10); int d = __

    すごいC言語のマクロ __is_constexpr - Qiita
    mas-higa
    mas-higa 2018/04/20
    なるほど。わからん。
  • 例え話をしないC言語のポインタの説明 | 右や左の旦那様

    まえおき 巷では「プログラマーになりたい人に初学者にとって、ポインタという考え方がわけわかめ」という話がよくあります。 そこでいろいろな人が「ポインタは住所だ」とか「変数がハコで」とか手を変え品を変え分かりやすいように説明してくれています。 それでもなお「ポインタがわかりづらい」という人が後を絶ちません。 もういっそのこと、例え話をやめてド直球で攻めたらいいんじゃないでしょうか。 Hello, Worldより簡単に サンプルコード 以下のコードを考えます。 void main() { int a; int b; int c; a = 1; b = 2; c = a + b; } 「#include <stdio.h>」なんていう謎のオマジナイはこの際ナシです。あんなもの無くたってC言語は成り立ちます。 まぁ見ての通り、どこにも何も出力されませんが。 このプログラムは、「c = a + b」

    例え話をしないC言語のポインタの説明 | 右や左の旦那様
    mas-higa
    mas-higa 2018/02/05
    void main() って
  • C言語 if文での中括弧省略や否定演算子使用を禁止する文献をご教示下さい

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

    C言語 if文での中括弧省略や否定演算子使用を禁止する文献をご教示下さい
    mas-higa
    mas-higa 2017/08/09
    規約の話より先にコンパイル通そう。
  • Valgrindの結果の見方、日本語訳、など役に立つことまとめ - 結果だけでなく過程も見てください

    勉強がてらメモ。 適宜更新していこう。うん。 Valgrindって? デバッグやプロファイラなどの複数のツールから構成されるツール群の総称。 メモリリークチェックツールとして有名だと思いますが、 それはValgrindツール群の中のMemcheckというツールによる機能だったのですね。 どんなツールがあるのか?マニュアルを見ると・・・ Memcheck 言わずと入れたメモリエラー検出ツール。特にC/C++に向いている。リークチェックやバッファーオーバーランなどね。 Cachegrind プログラムのキャッシュグラフ、または分岐予測をしてシミュレートする。プログラムを速くするために使うツール。 Callgrind 関数呼び出しをトレースしたりできる。Cachegrindをかぶる部分もあるが、Cachegrindとは別の情報も収集できる。 Helgrind マルチスレッドのプログラム向け。スレ

    Valgrindの結果の見方、日本語訳、など役に立つことまとめ - 結果だけでなく過程も見てください
  • CoqからのCプログラム生成 田中 哲 産業技術総合研究所 情報技術研究部門 2017-07-23 Proof Summit 2017

    CoqからのCプログラム生成 田中 哲 産業技術総合研究所 情報技術研究部門 2017-07-23 Proof Summit 2017 2/48 元ネタ ● 既発表の話です ● そのうち論文が出ます ● Safe Low-level Code Generation in Coq using Monomorphization and Monadification Akira Tanaka, Reynald Affeldt, Jacques Garrigue IPSJ SIGPRO 114, 2017-06-09, will be appear at IPSJ JIP. ● ここで出てくる plugin は github にあります – https://github.com/akr/monomorphization – https://github.com/akr/monadification

    mas-higa
    mas-higa 2017/07/25
    "高速で証明されたプログラムを利用できる" なるほど
  • 私はC言語を知らない | POSTD

    (注:2017/04/27、いただいたフィードバックを元に翻訳を修正いたしました。) この記事では、皆さん(特にC言語のプログラマ)に「自分はCを分かっていなかった」と気付いてもらうことを目標にしています。 Cの落とし穴は、思っているよりもずっと身近なところにあります。ちょっとしたコードにも 未定義の動作 が潜んでいることを以下で示しましょう。 この記事はQ&A形式になっており、それぞれの例題は独立したソースコードとして扱ってください。 1. Q: これは正しいコードでしょうか? (変数の二重定義エラーが発生するでしょうか。上述の通り、これは独立したソースファイルであり、関数体や複合ステートメントの一部ではありません) 解答 A: 正しいコードです。1行目は仮定義であり、2行目でコンパイラが処理した後に “定義” になります。 2. extern void bar(void); void

    私はC言語を知らない | POSTD
    mas-higa
    mas-higa 2017/04/26
  • Cのプロダクトを作るためにやったこと - Tomohisa Oda

    今年に入って Octopassというプロダクトを公開しました。それは、Linuxのユーザや権限をGithubのTeamと連携して運用を楽にするというツールでした。色んな方々のご協力により、多くのRetweetやはてぶいただいたことで、ある程度、Octopass を必要としそうな人の目に触れたのではないかと思っています。(Githubのスター数が少ないのは今後の課題)その中で「すごく便利」「ぜひ導入したい」というフィードバックは、継続して機能追加していくというモチベーションにつながっていて、非常にありがたいです。 さて、この Octopass は、Linuxユーザ名前解決をするためにの glibc の libnssモジュールをCで実装しています。cgoやその他の言語でShared Objectを吐き出しても良かったのですが、それだと技術的挑戦が足りないとして、触れてこなかったCに挑戦しました

    Cのプロダクトを作るためにやったこと - Tomohisa Oda
  • linuxカーネルで学ぶC言語のマクロ - Qiita

    はじめに 記事は電子書籍版もあります。 linuxカーネルはC言語のマクロを駆使して書かれています。それらのうち、凝ったマクロになじみの無い人には初見では意図がわからない&わかってみれば面白いであろうものをいくつか紹介いたします。対象読者は、C言語のユーザだけれども、マクロは定数定義くらいにしか使わないというライトなマクロユーザです。 マクロを使用する場所に依存するエラーを防ぐ 次のマクロは、二つの引き数の値を置換するだけの単純なものです。

    linuxカーネルで学ぶC言語のマクロ - Qiita
    mas-higa
    mas-higa 2017/03/03
    最初からつまずいた。do{ }while(0) 昔どっかで見たけど忘れてた。今まさに { } で囲んだだけのマクロがあるわー。if - else で使うとコンパイルできないのも再現してたのに、思い出せなかったわー。
  • C90, C99, C11, C++98, C++11で異なる動作をするコード | POSTD

    (訳注:2016/9/28、頂きましたフィードバックを元に記事を修正いたしました。) C言語の規格のリビジョン間には微妙な違いがありますが、このことを利用して「C90、C99、C11のどれとしてコンパイルされたかどうかにより、違う挙動をする」というプログラムを作ることが可能です。同様に、C++はほぼC言語の上位互換ですが、C言語とC++で違った結果を生み出すプログラムも存在します。 これは2015年の International Obfuscated C Code Contest (難読Cコード・国際コンテスト)への Don Yangの投稿 において、 C89、C99、C11、C++98、C11のどれとしてコンパイルされるかによって異なる出力を生成するプログラムを作成するのに使われています。C90の場合は、以下のような星形を出力します。 **************************

    C90, C99, C11, C++98, C++11で異なる動作をするコード | POSTD
    mas-higa
    mas-higa 2016/09/27
    R(U) が U"a"[0] に展開されるの直感的じゃないなぁ
  • 投機実行とOut of Orderはつよいというはなし - なるせにっき

    fluentdな人達と話していると定期的にRubyのオブジェクト生成が遅いとdisられます。 質的にしょうがない部分もあるんですが、それにしても遅い部分も結構あるので、おもむろにperf statとperf recordを取ってみましょう。 % sudo perf stat -d ./miniruby -e'GC.disable;i=1000000;while (i-=1)>0;Hash.new;end' Performance counter stats for './miniruby -eGC.disable;i=1000000;while (i-=1)>0;Hash.new;end': 467.629812 task-clock (msec) # 0.993 CPUs utilized 19 context-switches # 0.041 K/sec 2 cpu-migratio

    投機実行とOut of Orderはつよいというはなし - なるせにっき
    mas-higa
    mas-higa 2016/05/25
    DIV 遅い。まで読んだ。
  • 割り切れてるかの確認を高速化しようとして、コンパイラに負けた話 - なるせにっき

    今日見ていきたいのはtime.cのquo(VALUE x, VALUE y)です。akrさんのRuby における 2038年問題の解決で述べられているとおり、RubyのTimeは内部表現にRationalを使えるようになっているので、その辺を司る部品ですね。 static VALUE quo(VALUE x, VALUE y) { VALUE ret; if (FIXNUM_P(x) && FIXNUM_P(y)) { long a, b, c; a = FIX2LONG(x); b = FIX2LONG(y); if (b == 0) rb_num_zerodiv(); c = a / b; if (c * b == a) { return LONG2NUM(c); } } ret = rb_funcall(x, id_quo, 1, y); if (RB_TYPE_P(ret, T_R

    割り切れてるかの確認を高速化しようとして、コンパイラに負けた話 - なるせにっき
    mas-higa
    mas-higa 2016/03/30
    こういうのコンパイラによって吐かれるコードが違うとかないのかしらん?
  • 2016年、C言語はどう書くべきか (後編) | POSTD

    (前編はこちら: 2016年、C言語はどう書くべきか (前編) ) (編注:2020/08/18、いただいたフィードバックをもとに記事を修正いたしました。) システム依存の型 まだ「32 bitのプラットフォームでは32 bitのlong型、64 bitのプラットフォームでは64 bitのlong型がいい」という不満があるようですね。 プラットフォームに依存する2つの異なるサイズを使うため、 故意に コードを難しくすることを考えたくなければ、システム依存の型のために long を使おうとは思わないでしょう。 この状況では、プラットフォームのためにポインタ値を保持する整数型、 intptr_t を使うべきです。 モダン32-bitプラットフォームでは、 intptr_t は int32_t です。 モダン64-bitプラットフォームでは、 intptr_t は int64_t です。 int

    2016年、C言語はどう書くべきか (後編) | POSTD
    mas-higa
    mas-higa 2016/02/21
    最後の方は好みの押し付けやな。モダンとかそういう話じゃない。
  • 2016年、C言語はどう書くべきか (前編) | POSTD

    (訳注:2016/3/2、いただいた翻訳フィードバックをもとに記事を修正いたしました。) (訳注:著者のMattより、「文中で明言はしていないが、この記事の内容はx86-64 Unix/Linux/POSIXでアプリケーションをプログラミングする場合にフォーカスしている。他のプログラミング領域では、対象とするシステムに応じた(例: 8-bitの組み込みシステム、10年前のコンパイラ、多くの異なるCPUアーキテクチャで動く必要のあるアプリケーション、Win/Linuxでのビルド互換性など)特有のアドバイスが必要」との補足を頂いております。) 以下の文章は2015年の始めに書いたドラフトで、今まで公開していませんでした。私のドラフト用フォルダの中で誰の目も引かなかったため、大部分が書いた時のままです。公開するにあたり、単純に2015年を2016年に変更しました。 必要な修正、改善、苦情があり

    2016年、C言語はどう書くべきか (前編) | POSTD
    mas-higa
    mas-higa 2016/02/19
    ついに int を手放すときがきたか