Announcement

Collapse
No announcement yet.

The most stupid C bug ever

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • [C++] The most stupid C bug ever

    Dạo blog tình cờ thấy cái này

    Các bạn thử khoan đọc bài blog đầy đủ mà nhìn thử xem đoạn code này có lỗi gì?
    Code:
    else if (code == 200) {     // Downloading whole file
        /* Write new file (plus allow reading once we finish) */
        // FIXME Win32 native version fails because Microsoft's version of tmpfile() creates the file in C:\
       g = fname ? fopen(fname, "w+") : tmpfile();
    }
    Đoạn code này không chạy trong khi đoạn dưới đây chạy:
    Code:
    else if (code == 200) {     // Downloading whole file
        /* Write new file (plus allow reading once we finish) */
        // FIXME Win32 native version fails because Microsoft's version of tmpfile() creates the file in C:\
        //g = fname ? fopen(fname, "w+") : tmpfile();
        if(NULL != fname) {
            g = fopen(fname, "w+");
        else {
            g = tmpfile();
        }
    }

    Và đây là bài miêu tả đầy đủ hoàn cảnh ra đời của cái bug

  • #2
    Cái này là do sai sót của coder chứ bộ.
    Cùng vì cái này mà người ta cũng khuyên thêm hạn chế dùng macro.
    Last edited by 08520016; 24-08-2011, 22:44.

    Im a british accent lover

    Comment


    • #3
      Originally posted by 08520016 View Post
      Cái này là do sai sót của coder chứ bộ.
      Cùng vì cái này mà người ta cũng khuyên thêm hạn chế dùng macro.
      Thì sai sót của người lập trình, nhưng cụ thể là sai sót gì?

      Lỗi này có liên quan gì đến macro đâu, mà trong trường hợp này lập trình viên cũng đâu có dùng macro ?

      Comment


      • #4
        Theo em thấy thì cái hàm:
        g = fname ? fopen(fname, "w+") : tmpfile(); sẽ luôn gọi hàm [fopen (fname,"W+")] vì g= fname luôn có giá trị true.
        Do đó, nếu fname chưa được khỏi tạo thì hàm fopen (fname,"W+") có thể bị lỗi.

        Comment


        • #5
          Originally posted by 08520557 View Post
          Theo em thấy thì cái hàm:
          g = fname ? fopen(fname, "w+") : tmpfile(); sẽ luôn gọi hàm [fopen (fname,"W+")] vì g= fname luôn có giá trị true.
          Do đó, nếu fname chưa được khỏi tạo thì hàm fopen (fname,"W+") có thể bị lỗi.
          Chúng mừng em đã sai phép ? : được tính trước phép = tính sau cùng. Thử lại lần nữa đi em.

          Comment


          • #6
            èo do cái kí tự nối dòng '\' mà cuối câu comment của coder đó có C:\ .
            Còn người ta khuyên hạn chế dùng macro là em nói thêm 1 kinh nghiệm thui.

            Im a british accent lover

            Comment


            • #7
              Originally posted by 08520016 View Post
              èo do cái kí tự nối dòng '\' mà cuối câu comment của coder đó có C:\ .
              Còn người ta khuyên hạn chế dùng macro là em nói thêm 1 kinh nghiệm thui.
              Em tìm ra cái này trước hay sau khi đọc bài blog vậy
              Đọc được cái blog đó thì cũng khá đó.

              Còn macro thì cứ xài mạnh thôi, nó là thay thế code trực tiếp trước khi compile nên cho code tối ưu nhất. Khi cần viết các đoạn code có độ thực thi nhanh người ta sẽ tận dụng nó. Nếu không nên xài thì hẳn người ta bỏ từ lâu rồi =)). C vẫn còn được tiếp tục phát triển và cập nhật các chuẩn mới nên chắc nó... khó mà chứa các tính năng thừa lắm.

              Comment


              • #8
                Mấy bài dạng này em đã làm qua hết rồi (khi còn làm mod C/C++ congdongcviet) ,ở các topic bên cviet: Thữ Giãn với lập trình,coder quán.....
                Originally posted by 07520004 View Post
                Em tìm ra cái này trước hay sau khi đọc bài blog vậy
                Đọc được cái blog đó thì cũng khá đó.

                Còn macro thì cứ xài mạnh thôi, nó là thay thế code trực tiếp trước khi compile nên cho code tối ưu nhất. Khi cần viết các đoạn code có độ thực thi nhanh người ta sẽ tận dụng nó. Nếu không nên xài thì hẳn người ta bỏ từ lâu rồi =)). C vẫn còn được tiếp tục phát triển và cập nhật các chuẩn mới nên chắc nó... khó mà chứa các tính năng thừa lắm.
                Người ta kêu hạn chế chứ hok kêu bỏ .
                Sử dụng Macro 1 cách lạm dụng làm phá vỡ cấu trúc chương trình , quá trình bảo trì và phát triển gây khó khăn . Vì dùng macro thay hàm thường sẽ sử dụng rất nhiều dấu nối dòng '\' ,làm cho code không trong sáng.
                Thường macro chỉ để dùng viết thay cho những đoạn code ngắn.
                Last edited by 08520016; 25-08-2011, 00:08.

                Im a british accent lover

                Comment


                • #9
                  Originally posted by 08520016 View Post
                  Mấy bài dạng này em đã làm qua hết rồi (khi còn làm mod C/C++ congdongcviet) ,ở các topic bên cviet: Thữ Giãn với lập trình,coder quán.....

                  Người ta kêu hạn chế chứ hok kêu bỏ .
                  Sử dụng Macro 1 cách lạm dụng làm phá vỡ cấu trúc chương trình , quá trình bảo trì và phát triển gây khó khăn . Vì dùng macro thay hàm thường sẽ sử dụng rất nhiều dấu nối dòng '\' ,làm cho code không trong sáng.
                  Thường macro chỉ để dùng viết thay cho những đoạn code ngắn.
                  Excellently done! Câu đố được giải sớm hơn mình nghĩ

                  Comment


                  • #10
                    tauit_dnmd là trâu về C/C++ lắm. Nổi tiếng chứ chả phải đùa đâu. Thông tin này đã được kiểm chứng.
                    Originally posted by 08520016 View Post
                    Mấy bài dạng này em đã làm qua hết rồi (khi còn làm mod C/C++ congdongcviet) ,ở các topic bên cviet: Thữ Giãn với lập trình,coder quán.....

                    Người ta kêu hạn chế chứ hok kêu bỏ .
                    Sử dụng Macro 1 cách lạm dụng làm phá vỡ cấu trúc chương trình , quá trình bảo trì và phát triển gây khó khăn . Vì dùng macro thay hàm thường sẽ sử dụng rất nhiều dấu nối dòng '\' ,làm cho code không trong sáng.
                    Thường macro chỉ để dùng viết thay cho những đoạn code ngắn.
                    -------------------------------------
                    Đời là bể khổ.
                    Quay đầu là bờ ai ngờ là đại dương.
                    ------------------------------------------------------------------------

                    Comment

                    LHQC

                    Collapse
                    Working...
                    X