Trang 1 trên tổng số 3 123 Cuối cùngCuối cùng
Từ 1 tới 10 trên tổng số 25 kết quả

Đề tài: Lỗi memory trong code

  1. #1
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Question Lỗi memory trong code

    Mình code 1 c r a c k me nhỏ như sau :

    Code:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int main(int argc, char *argv[])
    {
    if (argc<2)
     {
      printf("Chua nhap pass vao\n");
      return 0;
     }
    
    char chuoi1[]="pass";
    char chuoi2[]="word";
    int len1=strlen(chuoi1);
    int len2=strlen(chuoi2);
    int len=len1+len2;
    
    char* chuoi=(char*)malloc(len);
    
    chuoi=strcat(chuoi2,chuoi1);
    
    int ketqua;
    ketqua = strcmp(argv[1], chuoi);
    if (ketqua==0)
      printf("ok, you got it\n");
    else
      printf("you are failed\n");
    
    free(chuoi);
    
    }
    Compile ok

    run nó thì cũng ok nhưng ngoài output, nó còn print ra 1 đống lỗi memory :

    Code:
    [root@server]# ./test2 pass
    you are failed
    *** glibc detected *** ./test2: munmap_chunk(): invalid pointer: 0x00007fffa6cef620 ***
    ======= Backtrace: =========
    /lib64/libc.so.6(cfree+0x1b6)[0x3f6dc74df6]
    ./test2(__gxx_personality_v0+0x1ef)[0x400797]
    /lib64/libc.so.6(__libc_start_main+0xf4)[0x3f6dc1d8b4]
    ./test2(__gxx_personality_v0+0x41)[0x4005e9]
    ======= Memory map: ========
    00400000-00401000 r-xp 00000000 68:03 1176661                            /root/c/test2
    00600000-00601000 rw-p 00000000 68:03 1176661                            /root/c/test2
    1785e000-1787f000 rw-p 1785e000 00:00 0
    3f6d800000-3f6d81a000 r-xp 00000000 68:03 4574376                        /lib64/ld-2.5.so
    3f6da1a000-3f6da1b000 r--p 0001a000 68:03 4574376                        /lib64/ld-2.5.so
    3f6da1b000-3f6da1c000 rw-p 0001b000 68:03 4574376                        /lib64/ld-2.5.so
    3f6dc00000-3f6dd4a000 r-xp 00000000 68:03 4574377                        /lib64/libc-2.5.so
    3f6dd4a000-3f6df49000 ---p 0014a000 68:03 4574377                        /lib64/libc-2.5.so
    3f6df49000-3f6df4d000 r--p 00149000 68:03 4574377                        /lib64/libc-2.5.so
    3f6df4d000-3f6df4e000 rw-p 0014d000 68:03 4574377                        /lib64/libc-2.5.so
    3f6df4e000-3f6df53000 rw-p 3f6df4e000 00:00 0
    3f6e400000-3f6e482000 r-xp 00000000 68:03 4574384                        /lib64/libm-2.5.so
    3f6e482000-3f6e681000 ---p 00082000 68:03 4574384                        /lib64/libm-2.5.so
    3f6e681000-3f6e682000 r--p 00081000 68:03 4574384                        /lib64/libm-2.5.so
    3f6e682000-3f6e683000 rw-p 00082000 68:03 4574384                        /lib64/libm-2.5.so
    3f70000000-3f7000d000 r-xp 00000000 68:03 4574385                        /lib64/libgcc_s-4.1.2-20080102.so.1
    3f7000d000-3f7020d000 ---p 0000d000 68:03 4574385                        /lib64/libgcc_s-4.1.2-20080102.so.1
    3f7020d000-3f7020e000 rw-p 0000d000 68:03 4574385                        /lib64/libgcc_s-4.1.2-20080102.so.1
    3f70800000-3f708e6000 r-xp 00000000 68:03 1553513                        /usr/lib64/libstdc++.so.6.0.8
    3f708e6000-3f70ae5000 ---p 000e6000 68:03 1553513                        /usr/lib64/libstdc++.so.6.0.8
    3f70ae5000-3f70aeb000 r--p 000e5000 68:03 1553513                        /usr/lib64/libstdc++.so.6.0.8
    3f70aeb000-3f70aee000 rw-p 000eb000 68:03 1553513                        /usr/lib64/libstdc++.so.6.0.8
    3f70aee000-3f70b00000 rw-p 3f70aee000 00:00 0
    2b0b03db8000-2b0b03dba000 rw-p 2b0b03db8000 00:00 0
    2b0b03dce000-2b0b03dd1000 rw-p 2b0b03dce000 00:00 0
    7fffa6cdc000-7fffa6cf2000 rw-p 7fffa6cdc000 00:00 0                      [stack]
    ffffffffff600000-ffffffffffe00000 ---p 00000000 00:00 0                  [vdso]
    Aborted
    Có ai biết tại sao và làm sao fix ko ?

    Thanx
    Đã được chỉnh sửa lần cuối bởi vietwow : 08-01-2009 lúc 01:39 PM.

  2. #2
    Ngày gia nhập
    01 2008
    Nơi ở
    UIT
    Bài viết
    129

    Trích dẫn Nguyên bản được gửi bởi vietwow Xem bài viết
    Mình code 1 c r a c k me nhỏ như sau :

    Code:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    int main(int argc, char *argv[])
    {
    if (argc<2)
     {
      printf("Chua nhap pass vao\n");
      return 0;
     }
    
    char chuoi1[]="pass";
    char chuoi2[]="word";
    int len1=strlen(chuoi1);
    int len2=strlen(chuoi2);
    int len=len1+len2;
    
    char* chuoi=(char*)malloc(len);
    
    chuoi=strcat(chuoi2,chuoi1);
    
    int ketqua;
    ketqua = strcmp(argv[1], chuoi);
    if (ketqua==0)
      printf("ok, you got it\n");
    else
      printf("you are failed\n");
    
    free(chuoi);
    
    }
    Bạn sử dụng sai cú pháp hàm strcat()

  3. #3
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Trích dẫn Nguyên bản được gửi bởi Hok_bik_zi Xem bài viết
    Bạn sử dụng sai cú pháp hàm strcat()
    Mình đã thử print đoạn đó rồi bạn, ko sai đâu, print ra chính xác mà, mình nghĩ lỗi trên là memory thui mà

  4. #4
    No Avatar
    ngocbig Khách

    C Code:
    1. char chuoi1[]="pass";
    2. char chuoi2[]="word";
    3. int len1=strlen(chuoi1);
    4. int len2=strlen(chuoi2);
    5. int len=len1+len2;
    6.  
    7. char* chuoi=(char*)malloc(len);

    Chúng ta xem xét từ đoạn này nhé.

    len1 = 4, len2 =4 => len = 8;

    char* chuoi=(char*)malloc(len); => chuoi co size = 8;

    chuoi=strcat(chuoi2,chuoi1); => null character de vao cho nao????

    PS: đang đọc quyển "Hacker Disassembling Uncovered" phải không? Trc mình cũng đọc quyển này rồi
    Đã được chỉnh sửa lần cuối bởi ngocbig : 08-01-2009 lúc 02:16 PM.

  5. #5
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Trích dẫn Nguyên bản được gửi bởi ngocbig Xem bài viết
    C Code:
    1. char chuoi1[]="pass";
    2. char chuoi2[]="word";
    3. int len1=strlen(chuoi1);
    4. int len2=strlen(chuoi2);
    5. int len=len1+len2;
    6.  
    7. char* chuoi=(char*)malloc(len);

    Chúng ta xem xét từ đoạn này nhé.

    len1 = 4, len2 =4 => len = 8;

    char* chuoi=(char*)malloc(len); => chuoi co size = 8;

    chuoi=strcat(chuoi2,chuoi1); => null character de vao cho nao????

    PS: đang đọc quyển "Hacker Disassembling Uncovered" phải không? Trc mình cũng đọc quyển này rồi
    Hi bạn,

    Mình đã thử sử code phần cấp phát memory lại :

    char* chuoi=(char*)malloc(len+2)

    Nhưng vậy ko được

    P/S: Đâu có bạn, cái này mình tự nghĩ ra viết chơi mà chắc tô tình trùng, để mình search down cuốn đó xem :P

    Thanx bạn

  6. #6
    No Avatar
    ngocbig Khách

    Mặc định Lỗi memory trong code

    C Code:
    1.     char* chuoi=(char*)malloc(len+1);
    2.     memset(chuoi,0,len+1);
    3.     strcat(chuoi,chuoi1);
    4.     strcat(chuoi,chuoi2);

    Để mình nói thêm nhé. Hàm strcat dùng để nối một chuỗi khác vào chuỗi đã có. Vị trí của chuỗi nối vào sẽ bắt bắt đầu tại vị trí null charater của chuỗi đích do đó phải set cho null character ở đầu chuỗi đích. Tất nhiên bạn cần nối hai lần

    Cuối cùng:

    C Code:
    1. #include<stdio.h>
    2. #include<string.h>
    3. #include<stdlib.h>
    4.  
    5. int main(int argc, char *argv[])
    6. {
    7.     if (argc<2)
    8.     {
    9.         printf("Chua nhap pass vao\n");
    10.         return -1;
    11.     }
    12.  
    13.     char chuoi1[]="pass";
    14.     char chuoi2[]="word";
    15.     int len1=strlen(chuoi1);
    16.     int len2=strlen(chuoi2);
    17.     int len=len1+len2;
    18.  
    19.     char* chuoi=(char*)malloc(len+1);
    20.     memset(chuoi,0,len+1);
    21.     strcat(chuoi,chuoi1);
    22.     strcat(chuoi,chuoi2);
    23.  
    24.     printf("%s",chuoi);
    25.     int ketqua;
    26.     ketqua = strcmp(argv[1], chuoi);
    27.     if (ketqua==0)
    28.         printf("ok, you got it\n");
    29.     else
    30.         printf("you are failed\n");
    31.  
    32.     free(chuoi);
    33.     return 0;
    34. }

  7. #7
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Cú pháp không sai nhưng truy xuất ngoài vùng nhớ, cậu đọc kĩ lại định nghĩa hàm strcat xem sao ?
    Java Code:
    1. #include <cstdio>
    2. #include <cstring>
    3. #include <cstdlib>
    4.  
    5. /*
    6.      Library C strcat(...) nó cũng tương tự như vậy
    7. */
    8. char* strcat_impl( char* des_str, const char* src_str )
    9. {
    10.     std::size_t length_of_des_str = strlen( des_str );
    11.     std::size_t o;
    12.    
    13.     for( o = 0; *( src_str + o ) != '\0'; ++o )
    14.             *( des_str + ( length_of_des_str + o ) ) = *( src_str + o );
    15.  
    16.     *( des_str + ( length_of_des_str + o ) ) = '\0';
    17.  
    18.     return des_str;
    19. }
    20.  
    21. int main()
    22. {
    23.     char s1[] = "pass";
    24.     char s2[] = "word";
    25.  
    26.     char* chuoi = ( char* )std::malloc( strlen( s1 ) + strlen( s2 ) + 1 );
    27.  
    28.     chuoi = strcat_impl( s2, s1 );
    29.  
    30.     std::printf( "%s", chuoi );
    31.  
    32.     std::free( chuoi );
    33.  
    34.     return 0;
    35. }
    Thằng destination mà là chuỗi s2 được à ?

  8. #8
    Ngày gia nhập
    11 2007
    Bài viết
    83

    Trích dẫn Nguyên bản được gửi bởi ngocbig Xem bài viết
    C Code:
    1.     char* chuoi=(char*)malloc(len+1);
    2.     memset(chuoi,0,len+1);
    3.     strcat(chuoi,chuoi1);
    4.     strcat(chuoi,chuoi2);

    Để mình nói thêm nhé. Hàm strcat dùng để nối một chuỗi khác vào chuỗi đã có. Vị trí của chuỗi nối vào sẽ bắt bắt đầu tại vị trí null charater của chuỗi đích do đó phải set cho null character ở đầu chuỗi đích. Tất nhiên bạn cần nối hai lần

    Cuối cùng:

    C Code:
    1. #include<stdio.h>
    2. #include<string.h>
    3. #include<stdlib.h>
    4.  
    5. int main(int argc, char *argv[])
    6. {
    7.     if (argc<2)
    8.     {
    9.         printf("Chua nhap pass vao\n");
    10.         return -1;
    11.     }
    12.  
    13.     char chuoi1[]="pass";
    14.     char chuoi2[]="word";
    15.     int len1=strlen(chuoi1);
    16.     int len2=strlen(chuoi2);
    17.     int len=len1+len2;
    18.  
    19.     char* chuoi=(char*)malloc(len+1);
    20.     memset(chuoi,0,len+1);
    21.     strcat(chuoi,chuoi1);
    22.     strcat(chuoi,chuoi2);
    23.  
    24.     printf("%s",chuoi);
    25.     int ketqua;
    26.     ketqua = strcmp(argv[1], chuoi);
    27.     if (ketqua==0)
    28.         printf("ok, you got it\n");
    29.     else
    30.         printf("you are failed\n");
    31.  
    32.     free(chuoi);
    33.     return 0;
    34. }
    Hi bạn, cấu trúc lệnh strcat theo mình bít là :

    strcat(dst, src)

    src là chuỗi cần nối vào chuỗi dst => như vậy trong TH của mình chuỗi src là mang2 (word) còn chuỗi dst là mang1 (chứa từ pass)

    Như bạn nói, "Vị trí của chuỗi nối vào sẽ bắt bắt đầu tại vị trí null charater của chuỗi đích do đó phải set cho null character ở đầu chuỗi đích" => đoạn này mình chưa hỉu lắm, ở đây "word" là chuỗi nối, "pass" là chuỗi có sẵn & cũng là chuỗi dst. Vậy bạn nói set null charater cho chuỗi dst nghĩa là set null charater cho chuỗi pass => vậy chẳng lẽ mảng sẽ là :

    [p][a][s][s][\0][w][o][r][d][\0]

    ??

    Sorry, mới tìm hiểu C nên nhiều điều ko hỉu. Mong mọi người thông cảm
    Thân,

  9. #9
    Ngày gia nhập
    12 2006
    Nơi ở
    US
    Bài viết
    1,917

    Vấn đề là s2 là fixed size, khi nối vào nó sẽ override, hên thì run, xui thì segment-fault.
    [p][a][s][s][\0][w][o][r][d][\0]
    Cậu hiểu không sai nhưng vấn đề là là chuỗi pass có size cố định là 4, khi cậu thêm vào nó sẽ không thể tự grow lên thành 8 được, cậu đọc kĩ đoạn strcat_impl của tui ở trên thì hiểu tại sao.

  10. #10
    No Avatar
    ngocbig Khách

    Không phải vậy.

    giả sử chuoi = [0][a][b][c]...

    khi dùng hàm strcat thì nó sẽ tìm từ đầu chuỗi cho tới cuối nếu thấy vị trí null thì sẽ lấy ghi chuỗi cần nối vào vị trị null đó trở đi.

    => chuoi "cat" chuoi1 = [p][a][s][s][0]....
    khi cat lần hai
    chuoi "cat" chuoi2 = [p][a][s][s][w][o][r][d][0]....

Các đề tài tương tự

  1. Cấp phát động và chống memory leak trong lập trình C
    Gửi bởi meoconlongvang trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 2
    Bài viết cuối: 27-09-2017, 11:49 PM
  2. Trả lời: 0
    Bài viết cuối: 01-03-2012, 10:41 PM
  3. làm sao đọc ghi memory process trong c#
    Gửi bởi kizokra trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 1
    Bài viết cuối: 11-03-2011, 02:11 PM
  4. Memory Leak trong lập trình C#?
    Gửi bởi tamntaptech trong diễn đàn Thắc mắc lập trình C#
    Trả lời: 10
    Bài viết cuối: 16-02-2011, 07:42 AM
  5. Các hàm xử lý bộ nhớ (memory) trong lập trình C
    Gửi bởi Xcross87 trong diễn đàn Thủ thuật, Tutorials và Mã nguồn C/C++/C++0x
    Trả lời: 4
    Bài viết cuối: 27-01-2008, 09:12 PM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn