揮発性のメモ2

知識をメモ書きしておく

C

gccで、実行バイナリとデバッグ情報を分離する

ランキング参加中Linuxランキング参加中プログラミングC#のpdbファイルみたいに、実行バイナリとデバッグ情報を分離したい 分離手順 デバッグ情報のファイル名を追記 とは 実行バイナリとデバッグ情報の紐付け デバッグ情報のファイル名 分離手順 次のコマン…

printfでUTF8混じりの文字列の最大文字数を指定する

C

ランキング参加中プログラミングprintfで文字列の最大文字数を指定する - 揮発性のメモ2 1234567890123456 じゃがいも :A ^^^^^^^^^^^^^^^^ ↑16文字 日本語混じりで桁を揃えてprintfで出力したい localeをちゃんと設定してwcharを使うべきだが、できないと…

GPIOのデバイスファイルから、値を連続して読む

GPIO sysfs で現在値を読むとき、普通はopenしてreadするとEOFに到達する (なので、catコマンドで普通に読める) $ cat /sys/class/gpio/gpio66/value 1 つまり、Cでopenしてreadするときは 2回読めない。 一般的には、lseekで先頭に戻してやる int buf[8];…

Cで、ミリ秒スリープする

#include <stdio.h> #include <time.h> #include <signal.h> #include <errno.h> /// ちゃんとミリ秒寝る関数 int sleep_msec(long long msec) { struct timespec ts; ts.tv_sec = msec/1000; ts.tv_nsec = (msec%1000)*1000000; int result; for(;;){ result = nanosleep(&ts, &ts); if(result==</errno.h></signal.h></time.h></stdio.h>…

sem_openで、Permission denied になる

セマフォを使ってロックをするプログラム #include <fcntl.h> // O_CREAT #include <semaphore.h> // sem_wait #include <stdio.h> // printf #include <unistd.h> // sleep int main() { sem_t *sem = sem_open("/unko", O_CREAT, 0666, 1); // ★パーミッション全開のつもり if(sem==NULL){ perror("s</unistd.h></stdio.h></semaphore.h></fcntl.h>…

clock_gettimeで指定するクロックの分解能を表示する

時刻をミリ秒まで欲しいんだけど、CLOCK_REALTIME_COARSE って精度十分だっけかなぁ というのを調べる話 clock_getres() で、どれだけ細かく時間が測定できるかがわかる #include <time.h> #include <stdio.h> int main() { struct timespec ts; clock_getres(CLOCK_MONOTONIC</stdio.h></time.h>…

gccで、スレッド間で同じメモリを同時にアクセスしてる人を探してぶっ殺したい

gccで、スレッド間で同じメモリを同時にアクセスしてる人を探してぶっ殺したい。そのためにはgccの TSAN(Thread Sanitizer)機能を使う -fsanitize=thread ソース #include <pthread.h> #include <stdio.h> volatile long long A=0; void *gettidtest( void *arg ) { int number</stdio.h></pthread.h>…

gccで、スタックを破壊している人を探してぶっ殺したい

C

gccで、スタックを破壊している人を探してぶっ殺したい。 #include <stdio.h> #include <string.h> void fn1() { int c=0; // intは4バイト。5~12で静かに破壊。13以上でSegv memset(&c, 0x55, 16); // memsetが最適化で消えないように printf("c=0x%x\n", c); } int main() { </string.h></stdio.h>…

gccで、構造体の中の配列の範囲を超えてアクセスしてる人を探してぶっ殺したい

C

gccで、配列の範囲を超えてアクセスしてる人を探してぶっ殺したい - 揮発性のメモ2gccで、構造体の中の配列の範囲を超えてアクセスしてる人を探してぶっ殺したい。 しかし、 -fsanitize=address で検知できるのは「構造体をはみ出たかどうか」のみである。 …

gccで、どんな最適化がかかっているかを見る

gcc -Q --help=optimizersこのコマンドで、どんなオプティマイズオプションがあるか、どれが有効になっているか を確認できる $ gcc -Q --help=optimizers The following options control optimizations: -O<number> -Ofast -Og -Os -Oz -faggressive-loop-optimizat</number>…

gccで、配列の範囲を超えてアクセスしてる人を探してぶっ殺したい

gccで、配列の範囲を超えてアクセスしてる人を探してぶっ殺したい。 そのためにはgccの ASAN(Address Sanitizer)機能を使う -fsanitize=address ソース コンパイル 実行結果 -fsanitize=bounds コンパイル 実行結果 コアダンプの設定 実行結果 処理能力 参…

[C][Linux] Cでuptimeを書く

clock_gettime() を使う Man page of CLOCK_GETRES CLOCK_MONOTONIC_COARSE か CLOCK_MONOTONIC を使うと起動経過時間が取れる 秒までなら CLOCK_MONOTONIC_COARSE でいい #include <time.h> // clock_gettime time_t uptime() { struct timespec ts; clock_gettime(</time.h>…

ファイルを新規作成するとき、仮ファイルを作って書ききってからリネームする

ファイルを新規作成するとき、仮ファイルを作って書ききってからリネームすると、 書いてる途中のファイルを「お、あるある」とか言って読まれないので比較的安全 #include <stdio.h> #include <stdlib.h> // mkstemp #include <unistd.h> // write int main() { // 仮ファイルを作って本</unistd.h></stdlib.h></stdio.h>…

if文、for文

if文for文の後ろは単文のみ許可、長くなる時は{ }でくくる というマイルール { は絶対次の行にしない。(関数宣言のときは逆に { を必ず次の行にする) 許さない書き方 /* 見つけ次第直す */ if(a>0) hoge(); for(i=0; i<10; i++) hoge(); /* 書いたやつを地…

CLionで WEXITSTATUS が未定義扱いになる

CLionで WEXITSTATUS がエラーになるのを 回避?する linuxjm.osdn.jp https://youtrack.jetbrains.com/issue/CPP-1472 今まで MinGWの開発環境を指定してたけど、なんとなく Cygwin のほうに切り替えたらマクロが認識されるようになった。

CLionで、ウィンドウのタイトルとメニューが一体化してしまったのを直す

iww.hateblo.jpいつのまにか設定UIが出来てたので、設定画面で直せるようになった Settings ⇒ Appearance & Behavior ⇒ Appearance ⇒ UI Options ⇒ □ Merge main menu with window title のチェックを外すとタイトルバーからメニューが分離される

Makefileで文字列の比較と文字列の結合

C

文字列はダブルクォートで囲わないのがコツ (ダブルクォート自体も文字列に含まれてしまう) マイナスで終わったり始まったりする文字列だとなんとなく囲いたくなるけどグッとこらえる ifeq ($(CROSS_COMPILE),sh4-linux-gnu-) LIBS += -m32 endif quruli.i…

Cで、breakが使えるスコープを使う

C

#define blockscope switch(0)default: puts("hoge\n"); puts("piyo\n"); blockscope{ puts("foo\n"); puts("bar\n"); if(baz==E_OK) break; puts("baz\n"); } puts("fuga\n"); 途中で小さいスコープを作ってbreakで脱出できるコードを書く方法で switch(0)d…

feofでループするとバグる

C PHP

feof() は終端まで到達していたらEOFを返すけど、終端かどうかは最後の文字の次の文字を読むまでわからない。 よって、while(!feof() みたいにループで1文字ずつ読むと、必ず最後にゴミがでる。今までファイルを1文字ずつ読んだことなんかなかったので、初め…

小数点以下の桁数を指定して表示する

123456 を 123456.00 みたいに小数点以下の桁数を指定して表示する var a = 123456; var n = 2; console.log( a.toFixed(n) ); // 123456.00 Number.prototype.toFixed() - JavaScript | MDN

呼び出しているライブラリと関数の一覧

nmでシンボルを抜き出して、フィルタをかけるMan page of nm nm -C hogehoge C C++ の関数名を可読にする nm コマンド – オブジェクトファイルのシンボル情報を表示する | Linuxコマンド.NET 呼び出してる関数⇒自分じゃ定義していない関数⇒未定義シンボル と…

AdLintで静的解析

C

結論から言うと、AdLintで静的解析してもあんまり意味なかった。 インストールも使い方もそこそこ簡単 出てくるメッセージも読みやすい mallocのfree忘れ、openのclose忘れなどは検知しない gccでWarningレベルガン上げにした方がずっと役立つ そもそも AdLi…

cygwinでgcc使うとき、無い関数とか

fdatasync fdatasync() は無いので、代わりに fsync() を使う。 Man page of FSYNC libiconv_open libiconv_open を使うときは libiconv-devel をインストールした上で、 -liconvオプションを付ける。 Win機に茶筅をインストール(3) Cygwin にChaSen を2つの…

printfと同じフォーマットの関数で同じ警告を出してもらう

C

gccの属性指定を使うと、printfをパクった関数でも同じような警告を出させるように宣言できる。 int log_printf( char *f, ... ) __attribute__ ((format (printf, 1, 2))); printfとtypedefの微妙な関係 - 無視されがち?なformt warning - 職業としてのプロ…

printfで%dはintにキャストされる

C

#include <stdio.h> int main(void) { unsigned int a=0x80000000; printf("sizeof(int)=%d\n",sizeof(int)); // 4 printf("d %d\n",a); // -2147483648 printf("ld %ld\n",a); // 2147483648 printf("u %u\n",a); // 2147483648 return 0; }</stdio.h>

Linuxのgccでは"linux"が定義されている

そんなん気づかないから1時間くらい悩んだ #ifdef linux #warning linuxは定義済み #endif typedef struct { char name[16]; int linux; } hoge_t; gpio_def.h:2:2: warning: #warning linuxは定義済み In file included from gpio_lib.h:5, from gpio_lib.c…

静的ライブラリをリンクする

C

直接ファイルをリンクする 一番楽なのは libhoge.a を直接指定してリンクする 静的ライブラリを後ろに書くのがコツ良い例 $ cc -lrt sample.o libhoge.a -o sample 悪い例 $ cc -lrt libhoge.a sample.o -o sample sample.o: In function `my_send': /home/u…

静的ライブラリを作る

C

all: libhoge.a libhoge.a: hoge1.o hoge2.o hoge3.o $(AR) $(ARFLAGS) $@ $^ 以下略静的ライブラリを作るにはアーカイバ ar を使う 変数ARのデフォルトは ar 変数ARFLAGSのデフォルトは rv Man page of ar

strncpy は文字列コピーじゃあない

C

Man page of STRCPY strncpyは文字列コピーと思ってはいけない。 名前にstrとかついてるだけのmemcpyの亜種、みたいに思わないとだめ。 void printbuf(int n){ int i; char buf[10]="@@@@@@@@@"; strncpy(buf,"hello",n); for(i=0;i<9;i++) printf("%02X ",b…

recvfromでバグを作りこむ

C

int result; char buf[256]; struct sockaddr_storage addr; socklen_t addrlen = 0; // ★バグ for(;;){ result = recvfrom(sd, buf, sizeof(buf), 0, &addr, &addrlen); if(result<0) continue; sendto(sd, "OK", 2, 0, &addr, addrlen); } recvfromで、ア…

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy