雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
- ソース を表示
- golibcのバグでお勉強 へ行く。
現: 2024-01-06 (土) 22:39:12 hideyosi | |||
---|---|---|---|
Line 1: | Line 1: | ||
+ | *strncat関数がおかしいぞ!? [#d2db4884] | ||
+ | [[本家の板>http://osask.net/v/index.php?topic_id=16#post_id186]]にて、うっちゃんが発見した挙動不審部。 | ||
+ | 以下がそのソース。 | ||
+ | char* strncat (char *d, const char *s, size_t sz) | ||
+ | { | ||
+ | char *tmp = d; | ||
+ | |||
+ | while ('\0' != *d) | ||
+ | d++; | ||
+ | |||
+ | while ('\0' != *s) { | ||
+ | if (0 == sz) | ||
+ | break; | ||
+ | sz--; | ||
+ | *d++ = *s++; | ||
+ | } | ||
+ | |||
+ | if (sz) | ||
+ | *d = '\0'; | ||
+ | |||
+ | return tmp; | ||
+ | } | ||
+ | |||
+ | *アドバイスの検証 [#e421d285] | ||
+ | はいそうです! アホなんで書かないとわかんないんです〜 orz | ||
+ | |||
+ | ''なぜこうなるのか?''について、うっちゃんが丁寧に教えてくれたのだ♪ | ||
+ | http://osask.net/v/index.php?topic_id=16#post_id239 | ||
+ | |||
+ | while ('\0' != *d) | ||
+ | d++; | ||
+ | これはなにをやってるのか。文字列sのオケツにポインタを進めていると。(仮に文字列の途中に0x00があれば、そこをオケツとするわけ。 | ||
+ | |||
+ | char str[4] = { 'a', '\0', 'H', '\0' }; | ||
+ | |||
+ | |>|>|>|文字列str| | ||
+ | |0|1|2|3| | ||
+ | |'a'|0x00|'H'|0x00| | ||
+ | |↑| | | | | ||
+ | |||
+ | 上記のwhileによってこういう状態になって、次の処理に移る・・・ | ||
+ | |||
+ | |||
+ | |>|>|>|文字列str| | ||
+ | |0|1|2|3| | ||
+ | |'a'|0x00|'H'|0x00| | ||
+ | | |↑ | | | | ||
+ | |||
+ | |||
+ | while ('\0' != *s) { | ||
+ | if (0 == sz) | ||
+ | break; | ||
+ | sz--; | ||
+ | *d++ = *s++; | ||
+ | } | ||
+ | |||
+ | 文字列sはこうなっている。 | ||
+ | |||
+ | |>|>|>|文字列s| | ||
+ | |0|1|2|3| | ||
+ | |'b'|'b'|'b'|0x00| | ||
+ | |↑ | | | | | ||
+ | |||
+ | szが1なので、whileループは一回だけ処理される | ||
+ | |||
+ | //szは1 | ||
+ | |||
+ | while ('\0' != *s) { | ||
+ | ↑ if (0 == sz) | ||
+ | │ break; | ||
+ | │ sz--; | ||
+ | │ *d++ = *s++; | ||
+ | │ } | ||
+ | │ | ||
+ | │ //szは0 | ||
+ | │ //よーし!ループするぞ! | ||
+ | └────────┘ | ||
+ | |||
+ | |||
+ | |||
+ | //szは0 | ||
+ | ┌──┐ while ('\0' != *s) { | ||
+ | │ │ if (0 == sz) | ||
+ | │ │ break; | ||
+ | │ │ sz--; | ||
+ | │ │ *d++ = *s++; | ||
+ | │ │ } | ||
+ | │ │ | ||
+ | │ │ //szは0 | ||
+ | │ │ //よーし!ループするぞ! | ||
+ | │ └────────┘ | ||
+ | └──────────┐ | ||
+ | ↓ | ||
+ | //なんだSZはもうゼロじゃん。なにもせんで次へ・・・ |
- golibcのバグでお勉強 のバックアップ差分(No. All)
- 現: 2024-01-06 (土) 22:39:12 hideyosi