[過去ログ] 【初心者歓迎】C/C++室 Ver.101【環境依存OK】 [無断転載禁止]©2ch.net (1002レス)
上下前次1-新
このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
854(1): デフォルトの名無しさん [sage] 2017/10/14(土) 20:59:25.10 ID:MqT/JM+M(1) AAS
>>850アクセスして良いメモリ範囲を越えてしまうバッファオーバーフローと、数値型の変数で表現可能な範囲を超えるオーバーフローは別の話。
そのソースで問題になるのは後者。
855: 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/10/14(土) 21:16:55.49 ID:WLIJLkzn(13/13) AAS
ちっ、俺がstrsafeを移植しないといけないか。
856(4): デフォルトの名無しさん [sage] 2017/10/14(土) 23:37:16.03 ID:q9IpA67V(2/2) AAS
>>851-854
ということは、255サイズのリングバッファ作りたいときって
unsigned char buffer[255] = {0};
unsigned char head=0, tail=0;
unsigned char pop(){
if(head==255) head = 0;
return buffer[++head];
}
void push(unsigned char data){
if(tail==255) tail = 0;
buffer[++tail]=data;
}
このサイズチェックのif文なくても大丈夫ってことですか?
857: デフォルトの名無しさん [sage] 2017/10/14(土) 23:48:06.29 ID:oz/gRrlj(1) AAS
お前の例だと255でゼロになるけど
オーバーフローの場合は256でゼロになる
よって必要
858: デフォルトの名無しさん [sage] 2017/10/15(日) 00:30:38.33 ID:9R+c2v2L(1) AAS
ひでーコードだ。
859: デフォルトの名無しさん [sage] 2017/10/15(日) 00:40:58.16 ID:4m9/y95n(1) AAS
headがぶっ壊れそう
860(1): 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/10/15(日) 05:20:33.19 ID:3VVV/TO4(1/2) AAS
>>856
#define BUFSIZE 255
unsigned char buf[BUFSIZE] = {0};
size_t head = 0, tail = 0;
void push(unsigned char data)
{
assert(head < BUFSIZE);
buffer[head] = data;
++head;
if (head >= BUFSIZE) head = 0;
}
unsigned char pop()
{
unsigned char ret;
assert(tail < BUFSIZE);
ret = buf[tail];
++tail;
if (tail >= BUFSIZE) tail = 0;
return ret;
}
861(1): デフォルトの名無しさん [sage釣] 2017/10/15(日) 09:46:01.53 ID:TMBfPksM(1) AAS
>>856
head &= 255; でチェック不要
862: デフォルトの名無しさん [sage] 2017/10/15(日) 10:09:16.14 ID:IWZc9Obf(1) AAS
単なる例なんだろうけど、バッファサイズ=255って中途半端だな。
buffer[255]にセンチネル置くんならわかるが。
863(1): デフォルトの名無しさん [sage] 2017/10/15(日) 11:47:13.03 ID:uX83yxiA(1) AAS
>>860
片山センセイ!
unsigned char buf[BUFSIZE] = {0};
て書いてある本と
unsigned char buf[BUFSIZE] = {};
て書いてある本があるんですけど同じでしょうか!?
864: 片山博文MZ ◆T6xkBnTXz7B0 [sage] 2017/10/15(日) 11:57:22.80 ID:3VVV/TO4(2/2) AAS
>>863
外部リンク[html]:cpplover.blogspot.jp
865: デフォルトの名無しさん [sage] 2017/10/15(日) 12:04:53.73 ID:t/hnbV6s(1) AAS
>>861
というポカをするからif分で書いとけよ。
アンド演算子が使えるならコンパイラが
勝手にやってくれる。
866: デフォルトの名無しさん [sage] 2017/10/15(日) 13:58:06.01 ID:Mr2SylDC(1) AAS
すこし譲って % 演算子で
867: デフォルトの名無しさん [sage] 2017/10/16(月) 02:26:41.08 ID:0Qezg1+a(1) AAS
除算より条件分岐の方が速い定期
868(1): デフォルトの名無しさん [sage] 2017/10/16(月) 06:49:20.44 ID:IzFutT5/(1/3) AAS
>>856
リングバッファの容量を256バイトにして、
バッファ領域を unsigned char buffer[256] = {0}; と
ちゃんと256バイト分確保すればサイズチェックは不要になるな。
ただし unsigned char の値範囲が 0 - 255 っていう「普通」の環境であること。
char が9ビットとか16ビットの機械/コンパイラもあるんだよね。
869(1): デフォルトの名無しさん [sage] 2017/10/16(月) 07:00:03.02 ID:IzFutT5/(2/3) AAS
それにしても >>856 は何やらモヤモヤするコードだと思ったら…
バッファサイズが 255 と半端な値
リングバッファのアクセス関数が push() / pop() て名前
インデクス操作が前置++
tail と head が互いを追い越す可能性(バッファあふれの可能性)
まだあるかな。
870(3): デフォルトの名無しさん [sage] 2017/10/16(月) 08:04:32.95 ID:iBTaJQF1(1) AAS
>char が9ビットとか16ビットの機械/コンパイラもあるんだよね。
え゛?まじで
871(1): デフォルトの名無しさん [sage] 2017/10/16(月) 08:18:16.95 ID:ipy+DI/z(1) AAS
>>869
buffer[1] 〜 buffer[255] を使う
っていう大きな問題がある
872(1): デフォルトの名無しさん [sage] 2017/10/16(月) 08:49:21.72 ID:IzFutT5/(3/3) AAS
先に == 255 の判定をして 0 に戻すから
範囲外の buffer[255] にアクセスする危険があるのか。
インデクスに前置++は見慣れなくて気色悪い、じゃ済まない問題だな。
873(1): デフォルトの名無しさん [sage] 2017/10/16(月) 12:53:13.92 ID:TeGVYWUh(1/2) AAS
>>871
buffer[1] 〜 buffer[254] までじゃね?
まあそれはそれでもやもやするけど w
874(1): デフォルトの名無しさん [sage] 2017/10/16(月) 12:59:13.25 ID:TeGVYWUh(2/2) AAS
>>870
俺も実機は見たことないけど
パーソナルコンピューターでは一般に8ビット長だが、DEC PDP-10、IBM 7090、ACOS-6の動作するNECのメインフレームなど、36ビットワードマシンでは1バイトが9ビットであり、charも9ビット長となっている。
外部リンク:www.wdic.org
875: デフォルトの名無しさん [sage] 2017/10/16(月) 16:13:16.23 ID:mLqrsWtl(1/2) AAS
>>872
危険ていうか
一周すれば確実にアクセスする
>>873
え?
876: デフォルトの名無しさん [sage] 2017/10/16(月) 16:14:16.39 ID:mLqrsWtl(2/2) AAS
>>874
char16bitならもうちょっと身近に
877(1): デフォルトの名無しさん [sage釣] 2017/10/16(月) 20:14:57.67 ID:e0xkLpP0(1) AAS
>>870
DSPとかだと40bitなんてのもあるよ
878: デフォルトの名無しさん [] 2017/10/16(月) 21:01:51.62 ID:JAGwlDmF(1) AAS
>>877
ほんとに?
上下前次1-新書関写板覧索設栞歴
あと 124 レスあります
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル
ぬこの手 ぬこTOP 0.022s