タグ

C言語に関するrabbit2goのブックマーク (19)

  • 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
  • 64bitのOS + C言語でライブラリを使わずにHello Worldをしてみた - Qiita

    この記事は、OthloTech Advent Calendar 2017 8日目の記事として書かれています。 昨日から2日連続で自分が担当しています。昨日はモバイルに関してでしたが、今日は打って変わってC言語でカーネルに近づいていきたいと思います。 具体的にはOSで定義されているシステムコールのみを利用してHello Worldをしていきます。 対象読者 Linuxカーネルに興味がある人。 システムコールに興味がある人。 Hello Worldの出し方が気になる人。 ArchLinuxが好きな人。 記事の内容 ライブラリを利用せずに文字列を出力します。 システムコールの使い方をかんたんにまとめます。 動作環境 OS Arch Linux x86_64 カーネルバージョン 4.14.3-1-ARCH gcc 7.2.1 nasm 2.13.01 gdb 8.0.1 初めてのHello Wor

    64bitのOS + C言語でライブラリを使わずにHello Worldをしてみた - Qiita
  • セルフホストできるCコンパイラを作ってみた - Qiita

    低レイヤを知りたい人のためのCコンパイラ作成入門 (以下 コンパイラブック) を一通り読んでCコンパイラを作ってみました。 このはまだ完全でなく(2020/09/01現在)、例えば構造体の実装の説明などは文章としては存在せず、このの参照実装である chibicc を写経がてら作っていきました。 (実際には今現在進行中の @rui さんの Cコンパイラ作成のオンラインコースを始めます の参加者のみに現状は公開されているchibiccよりもうちょっと改善されたcコンパイラ実装が参照実装だそうです) もともと構文解析とかはちょっと興味があったりして、qiitaでも [ruby] Parsletで構文解析する[その1] [ruby] Parsletで正規表現をパースしてvm型のエンジンを実装してみる[その1] パース〜ASTまで みたいな記事は書いていたんですが、あんまりややこしいパーサーは書

    セルフホストできるCコンパイラを作ってみた - Qiita
  • 「この位置にprintfが無いとなぜか動かないんだ。」 - Qiita

    はじめに 先日ツイッターで見かけた呟き pic.twitter.com/33Yk02hu1U — TOMO (@tomozh) October 14, 2020 そういうこともあるのか的な反応もあるようなので具体例を挙げてみることにする。 例1 所謂FizzBuzz問題。 #include <stdio.h> void fizzbuzz(int n) { int next; int i = 1; do { printf(i % 15 ? i % 5 ? i % 3 ? "%d\n" : "Fizz\n" : "Buzz\n" : "FizzBuzz\n", i); if (i++ >= n) next = 0; } while (next); } int main(void) { printf((char[]){""}); // この位置にprintfが無いとなぜか動かない fizzbuz

    「この位置にprintfが無いとなぜか動かないんだ。」 - Qiita
  • C言語の静的解析ツールを使ってみよう!|Splint

    C/C++言語の静的解析ツール、使っていますか?仕事で使う場合は有償のもの(QACやpgreliefなど)を使うことがおおいと思います。しかし休みの日に家でコードを書いたりするときにも個人で静的解析ツールを使いたい場合もあると思います。そこで今回は、フリーの静的解析ツール Splint について説明します。 静的解析ツールを使うことによってコードのバグを減らして品質を上げることができます。また、休みの日に孤独にコードを書いているときでも、 レビューの代わりとして使って自身のコーディング能力をアップさせる こともできます。 Splint のインストール Splint 公式サイト では「インストール用のバイナリはあまり更新されないから、ソースコードからビルドすることをオススメするよ!」というようなことが書いてあります。が、自分でビルドするのは手間なので、今回はインストール用のバイナリを素直に使

    C言語の静的解析ツールを使ってみよう!|Splint
  • シンプルで応用の効くmakefileとその解説 - URIN HACK

    シンプルで応用の効くmakefileとその解説 makefileは一度作るとそれ以降編集する機会が少なくなるので意外と真面目に考える人は少なく、ネット上でもまとまった情報は多くない。 Linux系OS上(正確に言うとGNU MakeとGCC)で複数のC/C++ソースファイルから1つの実行ファイルを作成(make)するための汎用的なmakefileテンプレートを作った。名前はまだない。適宜ディレクトリ構成や設計などに従ってmakefileをカスタマイズする必要があると思うがそのベースにする。 このmakefileのいいところ コンパイル対象となるソースファイルをワイルドカードで指定できる。 ヘッダファイル、ライブラリ、オブジェクトファイルなどコンパイル、リンクに関連するどのファイルが外部で変更されていてもきちんと 差分 コンパイルされる。 makefile自体に説明書(この記事)がある。 C

  • C言語のバグ回避をするための習慣 - Qiita

    概要 C言語でコーディングする上で気をつけている点などをまとめて見ました。 但し、書き方は人それぞれなので違和感を覚える人もいるかもしれませんが、 もし間違っている点がありましたらご指摘お願い致します。 目的 C言語について文法はある程度理解はしたが、その先がわからない。 という人向けにこんな感じでコーディングすればバグが減るかも。 という指針的なものを提供したかったです。 条件判定時の習慣 基的にはテストを行う部分ではありますが、急いでいたりすると 意外な盲点に気付かずにそのままスルーしてしまう事がよくあります。 多少面倒かもしれませんがちょっと書き方を工夫する事でミスを事前に回避できます。 変数の位置 条件判定の時、変数を左に書きたくなります。皆さんその方が理解しやすいと思います。 でも以下の書き方はやらない方が良いです。 何故ならうっかりミスで==を=にしてしまった時に気付かない可

    C言語のバグ回避をするための習慣 - Qiita
  • Big Sky :: clib の使い勝手にマジ感動した

    C言語でアプリケーションを書くのは他の言語と比べて少し気合が必要ですよね。例えば HTTPからデータを取得する 取得したデータを json パースする 結果の一部を色付きで表示する こんな場合、C言語プログラマは 「HTTP か、じゃぁcurlかな」 「JSON か、parson かな」 「色表示か...エスケープシーケンスでもいいけどWindowsがなー...」 といった事を考え、そこから curl や parson といった資材の調達を始める事になります。途中で新しい機能を追加したくなり、それを外部ライブラリに頼る場合だとその都度資材を調達する必要があり、思考を停止しなければなりません。 この辺は rubyperl、nodejs、golang 等の様に、ちょっとした手間だけで済ませたい物です。 またC言語の場合、ヘッダファイルはシステムの include フォルダに提供元が期待す

    Big Sky :: clib の使い勝手にマジ感動した
  • 実行中でのコールスタックの取得と表示 - 千里霧中

    メモ用。デバッグ等で有用なコールスタックはgdbなどの各種デバッガで取得できるけれど、実行中にアプリケーション内で取得したい場合がある。 それはglibcが使えるならbacktrace()、backtrace_symbols()で実現できる。 例えば下記のコード: #include <stdio.h> #include <execinfo.h> void hoge1(void) { size_t i; void *trace[128]; char **ss_trace; size_t size = backtrace(trace, sizeof(trace) / sizeof(trace[0])); ss_trace = backtrace_symbols(trace, size); if (ss_trace == NULL) { /*Failure*/ return; } /*例えば表示

    実行中でのコールスタックの取得と表示 - 千里霧中
    rabbit2go
    rabbit2go 2013/04/23
    MacOSXにaddr2lineは入っていない。
  • 普通のやつらの下を行け: C でバックトレース表示 - bkブログ

    普通のやつらの下を行け: C でバックトレース表示 普通のやつらの下を行けの第2回として、今回は glibc の関数を使って C でバックトレース (スタックトレース) の表示を行ってみます。 バックトレースとは バックトレースとは、大ざっぱに言うと、現在の関数に至るまでの道筋です。たとえば、次の Ruby プログラムを実行すると、 1 / 0 の行で例外が発生して、バックトレースの表示とともにプログラムは異常終了します。 def foo 1 / 0 end def main foo end main この例では main から foo を呼び foo の中の 1 / 0 の部分で例外が発生しています。 % ruby divide-by-zero.rb divide-by-zero.rb:2:in `/': divided by 0 (ZeroDivisionError) from div

  • Success is a Journey, not a Destination: 全てのCプログラマが未定義な振る舞いについて知っておくべきこと #1/3

    [What Every C Programmer Should Know About Undefined Behavior #1/3 の翻訳です。] LLVMでコンパイルしたコードは、最適化を有効にしているとたまにSIGTRAPシグナルを生成するのはなぜなのか、と聞かれることがある。いろいろ調べたあと、(X86での話だが) Clangは "ud2" インストラクションを生成していたことがわかった。"ud2" は__builtin_trap()が生成するインストラクションと同じものだ。[訳注: #UD例外を発生させる命令。ソフトウェアが#UD例外をハンドルできているかテストするために使われる。つまり、ソースコードが未定義な振る舞いを使っていたから、LLVMはud2インストラクションを生成したのであって、LLVMのバグではない、ということ] こういう問題は幾つかあって、すべて、Cの未定義な振る

  • 【ESEC】C言語向けモデル検査ツール「CBMC」で事前・事後条件を検証,エクスモーションが実演

    組み込みソフトウエア向けコンサルティングを手掛けるエクスモーションは,C言語向けのモデル検査ツール「CBMC」を用いて,C言語プログラム中の関数について事前条件・事後条件を検証する実演を見せた。関数の仕様を設計者が事前・事後条件として明示的に与えることで,関数の実装が仕様通りであることを確かめたり,関数の呼び出し関係を検証したりする。

    【ESEC】C言語向けモデル検査ツール「CBMC」で事前・事後条件を検証,エクスモーションが実演
  • Cでのコマンドラインパラメータの受け方メモ – taichino.com

    Cのプログラムでコマンドラインからパラメータを受けたい訳ですが、自力でやろうとしてもargv経由で文字列配列が渡されるだけなので非常に面倒です(LL病な自分としてはハッシュで欲しい)。例えば以下のgrepコマンドの用に複数のパラメータを順不同で受けたいとかになると、かなり大変ですね。 $ grep -nH -I -R search_text * そこで、なんか無いのかと思って調べてみるとgetoptを使えば良い事がわかりました。 この関数を使うとパラメータを受ける処理を以下のように書けます。第3引数で取り得るオプションの種類を指定します。”abcd:e:”の場合は、取り得るオプションはa,b,c,d,eの5種類で、その内コロン付きのdとeは値を取ります。 #include "stdio.h" #include "stdlib.h" #include "getopt.h" int main(

  • C/C++ 迷信集 | 株式会社きじねこ

    C/C++ を使うプログラマは大勢います。しかし、その多くは OJT を通して言語を学んだのではないでしょうか? 実はそこに大きな落とし穴があります。 コンピュータや工学のことをよく知らない人たちは、時代の先端を歩むプログラマには「迷信」など無関係だと信じて疑わないかも知れません。しかし、迷信や誤解はどんな世界にも常に存在しています。 というわけで、ここでは C/C++ にまつわる迷信、誤解、よくある間違いを採り上げていきます。非常に後ろ向きな企画ですが、暇つぶし気分転換に読んでみてください。もしかすると、ご自身が迷信にとらわれていたことに気付くかもしれません。 追記(2009/03/15) このコーナーでは、C/C++ にまつわる迷信、誤解、よくある間違いを扱っています。決して「迷信」だけではないのですが、タイトルにはすべて[迷信]を付けています。 これは、主に検索エンジンでタイトルを見

  • Programming with C Blocks on Apple Devices

    Programming with C Blocks On Apple Devices by Joachim Bengtsson What are Blocks? What are Blocks Good For? Getting Started On and for Mac OS X 10.6 Snow Leopard, or for iOS 4 On Mac OS X 10.5 Leopard or for iPhone Blocks in C Syntax and Usage Memory Management Blocks in Objective-C Blocks and ARC (Automatic Reference Counting) Blocks in C++ Block Goodies References and Additional Sources Version H

  • C言語: 実行時間測定の方法

    C言語において実行時間を測定する為の方法はいくつかある。gettimeofday, clock, getrusage, timesを利用する方法である。ここではこれらの方法について検証してみる。これは2005/12/30時点での情報であり、古い亊が考えられるので注意して頂きたい。さらに、内容のほとんどはmanを移しただけなので、正確な情報を得るためにそれぞれの関数のmanを見ることを強く推奨する。 System: Linux 2.6.12 glibc: glibc 2.3.5-1ubuntu12 gettimeofdayを使用する方法 通常はこの関数を使用するのをお勧めする。 gettimeofdayはSVr4, BSD 4.3準拠である。返り値の型はsys/time.hに定義されるstruct timevalで有る。

  • トリビアなmakefile入門

    make/makefileは,大きいプログラムのどの断片が再コンパイルされる必要があるかという事と,それらを再コンパイルする発行コマンドを自動的に決定するユーティリティ/設定ファイルです. コンピュータサイエンスの基的な考え方のひとつに冗長性をなくして効率化する構成を追及するというのがあります. 情報理論(bitの理論),HTMLとブラウザ,高級言語と機械語など,ひとつの仕様(表現)から環境や状況にあわせて実装(記述)をつくりだす構成が好まれます. ひとつのファイルでさまざまなコマンドを制御するmake/makefileを制することはコンピュータサイエンスを制することになります. makeのあれこれ もっとも単純な例 Makefile は以下のようなルールからなる.

  • C言語講座:初級から中級まで

    C言語講座>サイトマップ C言語講座:初級から中級まで プログラム言語は、自然言語とコンピュータ言語との間にある人工的な言語です。この講座では、C言語を学びます(開 設:2000.09.01)。 [サイトマップ][ガイダンス][C言語講座の出入り口][アルゴリズム研究室][ソースのコンパイル][C言語の作法][”C言語流”文章作成講座][お断り][使えるリンク集] [言葉は記憶の彼方へ] 死語、半死語、現行語、専門用語、業界用語、隠語。 [ハイテク昔話] 古い経験を、ただ古いだけの私がご紹介します。 [英単語に見える16進数] 病気か?死ぬの? [絵のない絵式乗馬教室] 頭の中に馬を飼ってみませんか。 [プロフィール] [パクられました。][またパクられました。][またまたパクられました。] リンクはご自由に。メールはfujinoy@+cts.ne.jp(”+”を削除)へ。 C言語講座>

  • SQLite3をC言語で使う練習。 - 与太郎プログラマの日記

    ちょうどよい記事を見つけてしまったので練習してみる。 元祖 サトシのブログ:「SQLite の INSERT は遅いのか?」 簡潔なテストコード。ちょっと拝借してSQLite3用に手直し。環境は、 マシン:iBook G4 OS:Mac OSX 10.4.8 BGM:帰ってこいよ@大城バネサ 適当なフォルダに以下のファイルを作成。 instest.c #include <stdio.h> #include <stdlib.h> #include <sqlite3.h> #define INSERT_COUNT 1000 int main(int argc, char *argv[]) { sqlite3 *db; char *errmsg; int i; /* SQLite データベースを OPEN */ sqlite3_open("instest.db", &db); if (!db)

    SQLite3をC言語で使う練習。 - 与太郎プログラマの日記
  • 1