雑記帳
ここはhideyosiの雑記帳です。テケトーに書き散らしてるだけなので間違っていたりとは普通にしてます。信用度は相当低いことをあらかじめご了承を。またご覧のようにWikiを使ってますが、hideyosi意外は書き込めません。
  
現: 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